[mapguide-commits] r5519 - sandbox/adsk/2.3r/Server/src/Common/Manager

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Fri Feb 4 18:08:42 EST 2011


Author: brucedechant
Date: 2011-02-04 15:08:42 -0800 (Fri, 04 Feb 2011)
New Revision: 5519

Modified:
   sandbox/adsk/2.3r/Server/src/Common/Manager/CacheManager.cpp
   sandbox/adsk/2.3r/Server/src/Common/Manager/FdoConnectionManager.cpp
   sandbox/adsk/2.3r/Server/src/Common/Manager/FdoConnectionManager.h
Log:
Fix for trac ticket 1584 - Feature source create or update locks up server while under load
http://trac.osgeo.org/mapguide/ticket/1584

Notes:
- Adjust locks to prevent deadlock


Modified: sandbox/adsk/2.3r/Server/src/Common/Manager/CacheManager.cpp
===================================================================
--- sandbox/adsk/2.3r/Server/src/Common/Manager/CacheManager.cpp	2011-02-04 21:38:17 UTC (rev 5518)
+++ sandbox/adsk/2.3r/Server/src/Common/Manager/CacheManager.cpp	2011-02-04 23:08:42 UTC (rev 5519)
@@ -118,10 +118,13 @@
 {
     // The mutex usage and the method call order here are important
     // because they ensure all the caches are in sync.
-    ACE_MT(ACE_GUARD(ACE_Recursive_Thread_Mutex, ace_mon, m_featureServiceCache.m_mutex));
+    ACE_MT(ACE_GUARD(ACE_Recursive_Thread_Mutex, ace_mon, m_fdoConnectionManager->sm_mutex));
+    {
+        ACE_MT(ACE_GUARD(ACE_Recursive_Thread_Mutex, ace_mon, m_featureServiceCache.m_mutex));
 
-    m_fdoConnectionManager->ClearCache();
-    m_featureServiceCache.Clear();
+        m_fdoConnectionManager->ClearCache();
+        m_featureServiceCache.Clear();
+    }
 }
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -157,10 +160,13 @@
     {
         // The mutex usage and the method call order here are important
         // because they ensure all the caches are in sync.
-        ACE_MT(ACE_GUARD(ACE_Recursive_Thread_Mutex, ace_mon, m_featureServiceCache.m_mutex));
+        ACE_MT(ACE_GUARD(ACE_Recursive_Thread_Mutex, ace_mon, m_fdoConnectionManager->sm_mutex));
+        {
+            ACE_MT(ACE_GUARD(ACE_Recursive_Thread_Mutex, ace_mon, m_featureServiceCache.m_mutex));
 
-        m_fdoConnectionManager->RemoveCachedFdoConnection(resource);
-        m_featureServiceCache.RemoveEntry(resource);
+            m_fdoConnectionManager->RemoveCachedFdoConnection(resource);
+            m_featureServiceCache.RemoveEntry(resource);
+        }
     }
 }
 
@@ -174,10 +180,13 @@
     {
         // The mutex usage and the method call order here are important
         // because they ensure all the caches are in sync.
-        ACE_MT(ACE_GUARD(ACE_Recursive_Thread_Mutex, ace_mon, m_featureServiceCache.m_mutex));
+       ACE_MT(ACE_GUARD(ACE_Recursive_Thread_Mutex, ace_mon, m_fdoConnectionManager->sm_mutex));
+        {
+            ACE_MT(ACE_GUARD(ACE_Recursive_Thread_Mutex, ace_mon, m_featureServiceCache.m_mutex));
 
-        m_fdoConnectionManager->RemoveCachedFdoConnection(resource);
-        m_featureServiceCache.RemoveEntry(resource);
+            m_fdoConnectionManager->RemoveCachedFdoConnection(resource);
+            m_featureServiceCache.RemoveEntry(resource);
+        }
     }
 }
 

Modified: sandbox/adsk/2.3r/Server/src/Common/Manager/FdoConnectionManager.cpp
===================================================================
--- sandbox/adsk/2.3r/Server/src/Common/Manager/FdoConnectionManager.cpp	2011-02-04 21:38:17 UTC (rev 5518)
+++ sandbox/adsk/2.3r/Server/src/Common/Manager/FdoConnectionManager.cpp	2011-02-04 23:08:42 UTC (rev 5519)
@@ -21,6 +21,7 @@
 #include "LogManager.h"
 #include "LongTransactionManager.h"
 #include "CacheManager.h"
+#include "LogDetail.h"
 
 ACE_Recursive_Thread_Mutex ProviderInfo::sm_mutex;
 ACE_Recursive_Thread_Mutex MgFdoConnectionManager::sm_mutex;
@@ -224,6 +225,10 @@
 
     MG_FDOCONNECTION_MANAGER_TRY()
 
+    MgLogDetail logDetail(MgServiceType::FeatureService, MgLogDetail::InternalTrace, L"MgFdoConnectionManager.Open", mgStackParams);
+    logDetail.AddResourceIdentifier(L"Resource", resourceIdentifier);
+    logDetail.Create();
+
     ACE_TRACE ("MgFdoConnectionManager::Open");
 
     MgCacheManager* cacheManager = MgCacheManager::GetInstance();
@@ -323,13 +328,18 @@
 
 FdoIConnection* MgFdoConnectionManager::Open(CREFSTRING provider, CREFSTRING connectionString)
 {
-    ACE_MT(ACE_GUARD_RETURN(ACE_Recursive_Thread_Mutex, ace_mon, sm_mutex, NULL));
-
     FdoPtr<FdoIConnection> pFdoConnection;
     ProviderInfo* providerInfo = NULL;
 
     MG_FDOCONNECTION_MANAGER_TRY()
 
+    MgLogDetail logDetail(MgServiceType::FeatureService, MgLogDetail::InternalTrace, L"MgFdoConnectionManager.Open", mgStackParams);
+    logDetail.AddString(L"Provider", provider);
+    logDetail.AddString(L"Connection", connectionString);
+    logDetail.Create();
+
+    ACE_MT(ACE_GUARD_RETURN(ACE_Recursive_Thread_Mutex, ace_mon, sm_mutex, NULL));
+
     ACE_TRACE ("MgFdoConnectionManager::Open");
 
     // The connection string may contain substitution tags that need updating
@@ -438,12 +448,16 @@
 
 void MgFdoConnectionManager::Close(FdoIConnection* pFdoConnection)
 {
-    ACE_MT(ACE_GUARD(ACE_Recursive_Thread_Mutex, ace_mon, sm_mutex));
-
     CHECKNULL((FdoIConnection*)pFdoConnection, L"MgFdoConnectionManager.Close()");
 
     MG_FDOCONNECTION_MANAGER_TRY()
 
+    MgLogDetail logDetail(MgServiceType::FeatureService, MgLogDetail::InternalTrace, L"MgFdoConnectionManager.Close", mgStackParams);
+    logDetail.AddInt64(L"FdoConnection", (INT64) pFdoConnection);
+    logDetail.Create();
+
+    ACE_MT(ACE_GUARD(ACE_Recursive_Thread_Mutex, ace_mon, sm_mutex));
+
     ACE_TRACE ("MgFdoConnectionManager::Close");
 
     // Make this connection available
@@ -454,10 +468,13 @@
 
 void MgFdoConnectionManager::RemoveExpiredFdoConnections()
 {
+    MG_FDOCONNECTION_MANAGER_TRY()
+
+    MgLogDetail logDetail(MgServiceType::FeatureService, MgLogDetail::InternalTrace, L"MgFdoConnectionManager.RemoveExpiredFdoConnections", mgStackParams);
+    logDetail.Create();
+
     ACE_MT(ACE_GUARD(ACE_Recursive_Thread_Mutex, ace_mon, sm_mutex));
 
-    MG_FDOCONNECTION_MANAGER_TRY()
-
     ACE_Time_Value now = ACE_OS::gettimeofday();
 
     // Loop all of the providers to get the FDO connection caches
@@ -622,12 +639,18 @@
 
 FdoIConnection* MgFdoConnectionManager::SearchFdoConnectionCache(CREFSTRING provider, CREFSTRING key, CREFSTRING ltName)
 {
-    ACE_MT(ACE_GUARD_RETURN(ACE_Recursive_Thread_Mutex, ace_mon, sm_mutex, NULL));
-
     FdoPtr<FdoIConnection> pFdoConnection;
 
     MG_FDOCONNECTION_MANAGER_TRY()
 
+    MgLogDetail logDetail(MgServiceType::FeatureService, MgLogDetail::InternalTrace, L"MgFdoConnectionManager.SearchFdoConnectionCache", mgStackParams);
+    logDetail.AddString(L"Provider", provider);
+    logDetail.AddString(L"Key", key);
+    logDetail.AddString(L"LTName", ltName);
+    logDetail.Create();
+
+    ACE_MT(ACE_GUARD_RETURN(ACE_Recursive_Thread_Mutex, ace_mon, sm_mutex, NULL));
+
     // Loop all of the providers to get the FDO connection caches
     ProviderInfoCollection::iterator iterProviderInfoCollection = m_ProviderInfoCollection.find(provider);
     if(m_ProviderInfoCollection.end() != iterProviderInfoCollection)
@@ -918,6 +941,12 @@
 
 void MgFdoConnectionManager::Open(FdoIConnection* pFdoConnection)
 {
+    MG_FDOCONNECTION_MANAGER_TRY()
+
+    MgLogDetail logDetail(MgServiceType::FeatureService, MgLogDetail::InternalTrace, L"MgFdoConnectionManager.Open", mgStackParams);
+    logDetail.AddInt64(L"FdoConnection",(INT64) pFdoConnection);
+    logDetail.Create();
+
     try
     {
         // Open the connection to the FDO provider
@@ -952,6 +981,8 @@
         throw new MgConnectionFailedException(L"MgFdoConnectionManager.Open",
             __LINE__, __WFILE__, NULL, L"", NULL);
     }
+
+    MG_FDOCONNECTION_MANAGER_CATCH_AND_THROW(L"MgFdoConnectionManager.CacheFdoConnection")
 }
 
 STRING MgFdoConnectionManager::UpdateProviderName(CREFSTRING provider)
@@ -980,14 +1011,20 @@
 
 bool MgFdoConnectionManager::RemoveCachedFdoConnection(CREFSTRING resource, bool strict)
 {
+    bool success = false;
+
+    MG_FDOCONNECTION_MANAGER_TRY()
+
+    MgLogDetail logDetail(MgServiceType::FeatureService, MgLogDetail::InternalTrace, L"MgFdoConnectionManager.RemoveCachedFdoConnection", mgStackParams);
+    logDetail.AddString(L"Resource",resource);
+    logDetail.AddBool(L"Strict", strict);
+    logDetail.Create();
+
     ACE_MT(ACE_GUARD_RETURN(ACE_Recursive_Thread_Mutex, ace_mon, sm_mutex, false));
 
-    bool success = false;
     INT32 connections = 0;
     INT32 connectionsRemoved = 0;
 
-    MG_FDOCONNECTION_MANAGER_TRY()
-
     if (resource.empty())
     {
         MgStringCollection arguments;
@@ -1130,6 +1167,12 @@
 {
     MG_FDOCONNECTION_MANAGER_TRY()
 
+    MgLogDetail logDetail(MgServiceType::FeatureService, MgLogDetail::InternalTrace, L"MgFdoConnectionManager.CacheFdoConnection", mgStackParams);
+    logDetail.AddString(L"Provider", provider);
+    logDetail.AddString(L"Key", key);
+    logDetail.AddString(L"LTName", ltName);
+    logDetail.Create();
+
     // Protect the cache
     ACE_MT(ACE_GUARD(ACE_Recursive_Thread_Mutex, ace_mon, sm_mutex));
 
@@ -1194,6 +1237,10 @@
 
     MG_FDOCONNECTION_MANAGER_TRY()
 
+    MgLogDetail logDetail(MgServiceType::FeatureService, MgLogDetail::InternalTrace, L"MgFdoConnectionManager.UpdateFdoConnectionCache", mgStackParams);
+    logDetail.AddString(L"Provider", provider);
+    logDetail.Create();
+
     // Protect the cache
     ACE_MT(ACE_GUARD_RETURN(ACE_Recursive_Thread_Mutex, ace_mon, sm_mutex, false));
 
@@ -1288,6 +1335,10 @@
 
     MG_FDOCONNECTION_MANAGER_TRY()
 
+    MgLogDetail logDetail(MgServiceType::FeatureService, MgLogDetail::InternalTrace, L"MgFdoConnectionManager.AcquireFdoConnection", mgStackParams);
+    logDetail.AddString(L"Provider", provider);
+    logDetail.Create();
+
     // Protect the cache
     ACE_MT(ACE_GUARD_RETURN(ACE_Recursive_Thread_Mutex, ace_mon, sm_mutex, NULL));
 
@@ -1322,6 +1373,11 @@
 
 void MgFdoConnectionManager::ClearCache()
 {
+    MG_FDOCONNECTION_MANAGER_TRY()
+
+    MgLogDetail logDetail(MgServiceType::FeatureService, MgLogDetail::InternalTrace, L"MgFdoConnectionManager.ClearCache", mgStackParams);
+    logDetail.Create();
+
     ACE_MT(ACE_GUARD(ACE_Recursive_Thread_Mutex, ace_mon, sm_mutex));
 
 #ifdef _DEBUG_FDOCONNECTION_MANAGER
@@ -1433,15 +1489,19 @@
     ACE_DEBUG ((LM_DEBUG, ACE_TEXT("MgFdoConnectionManager::ClearCache - FDO cache AFTER\n")));
     ShowCache();
 #endif
+    MG_FDOCONNECTION_MANAGER_CATCH_AND_THROW(L"MgFdoConnectionManager.ClearCache")
 }
 
 
 void MgFdoConnectionManager::ShowCache()
 {
+    MG_FDOCONNECTION_MANAGER_TRY()
+
+    MgLogDetail logDetail(MgServiceType::FeatureService, MgLogDetail::InternalTrace, L"MgFdoConnectionManager.ShowCache", mgStackParams);
+    logDetail.Create();
+
     ACE_MT(ACE_GUARD(ACE_Recursive_Thread_Mutex, ace_mon, sm_mutex));
 
-    MG_FDOCONNECTION_MANAGER_TRY()
-
     size_t cacheCollectionSize = m_ProviderInfoCollection.size();
     ACE_DEBUG ((LM_DEBUG, ACE_TEXT("MgFdoConnectionManager::ShowCache()\n")));
     ACE_DEBUG ((LM_DEBUG, ACE_TEXT("Provider Information caches: %d\n"), cacheCollectionSize));
@@ -1499,10 +1559,16 @@
 
 ProviderInfo* MgFdoConnectionManager::GetProviderInformation(CREFSTRING provider)
 {
+    ProviderInfo* providerInfo = NULL;
+
+    MG_FDOCONNECTION_MANAGER_TRY()
+    
+    MgLogDetail logDetail(MgServiceType::FeatureService, MgLogDetail::InternalTrace, L"MgFdoConnectionManager.GetProviderInformation", mgStackParams);
+    logDetail.AddString(L"Provider", provider);
+    logDetail.Create();
+
     ACE_MT(ACE_GUARD_RETURN(ACE_Recursive_Thread_Mutex, ace_mon, sm_mutex, NULL));
 
-    ProviderInfo* providerInfo = NULL;
-
     ProviderInfoCollection::iterator iter = m_ProviderInfoCollection.find(provider);
     if(iter != m_ProviderInfoCollection.end())
     {
@@ -1519,15 +1585,20 @@
         }
     }
 
+    MG_FDOCONNECTION_MANAGER_CATCH_AND_THROW(L"MgFdoConnectionManager.GetProviderInformation")
+
     return providerInfo;
 }
 
 void MgFdoConnectionManager::ShowProviderInfoCache()
 {
+    MG_FDOCONNECTION_MANAGER_TRY()
+
+    MgLogDetail logDetail(MgServiceType::FeatureService, MgLogDetail::InternalTrace, L"MgFdoConnectionManager.ShowProviderInfoCache", mgStackParams);
+    logDetail.Create();
+
     ACE_MT(ACE_GUARD(ACE_Recursive_Thread_Mutex, ace_mon, sm_mutex));
 
-    MG_FDOCONNECTION_MANAGER_TRY()
-
     size_t cacheCollectionSize = m_ProviderInfoCollection.size();
     ACE_DEBUG ((LM_INFO, ACE_TEXT("MgFdoConnectionManager::ShowProviderInfoCache()\n")));
     ACE_DEBUG ((LM_INFO, ACE_TEXT("Provider Information cache size: %d\n"), cacheCollectionSize));
@@ -1582,10 +1653,14 @@
 
 void MgFdoConnectionManager::MakeFdoConnectionAvailable(FdoIConnection* connection)
 {
+    MG_FDOCONNECTION_MANAGER_TRY()
+
+    MgLogDetail logDetail(MgServiceType::FeatureService, MgLogDetail::InternalTrace, L"MgFdoConnectionManager.MakeFdoConnectionAvailable", mgStackParams);
+    logDetail.AddInt64(L"FdoConnection", (INT64) connection);
+    logDetail.Create();
+
     ACE_MT(ACE_GUARD(ACE_Recursive_Thread_Mutex, ace_mon, sm_mutex));
 
-    MG_FDOCONNECTION_MANAGER_TRY()
-
 #ifdef _DEBUG_FDOCONNECTION_MANAGER
     ACE_DEBUG((LM_INFO, ACE_TEXT("MgFdoConnectionManager::MakeFdoConnectionAvailable - Provider Info Cache Before\n")));
     ShowProviderInfoCache();
@@ -1705,6 +1780,12 @@
     ProviderInfo* providerInfo = NULL;
     bool bConnectionAvailable = false;
 
+    MG_FDOCONNECTION_MANAGER_TRY()
+
+    MgLogDetail logDetail(MgServiceType::FeatureService, MgLogDetail::InternalTrace, L"MgFdoConnectionManager.TryAcquireFdoConnection", mgStackParams);
+    logDetail.AddString(L"Provider", provider);
+    logDetail.Create();
+
     // The code segment below needs to be guarded
     {
         ACE_MT(ACE_GUARD_RETURN(ACE_Recursive_Thread_Mutex, ace_mon, sm_mutex, NULL));
@@ -1780,6 +1861,8 @@
         providerInfo = NULL;
     }
 
+    MG_FDOCONNECTION_MANAGER_CATCH_AND_THROW(L"MgFdoConnectionManager.TryAcquireFdoConnection")
+
     return providerInfo;
 }
 
@@ -1788,6 +1871,11 @@
     STRING info = L"";
     wchar_t buffer[255];
 
+    MG_FDOCONNECTION_MANAGER_TRY()
+
+    MgLogDetail logDetail(MgServiceType::FeatureService, MgLogDetail::InternalTrace, L"MgFdoConnectionManager.GetFdoCacheInfo", mgStackParams);
+    logDetail.Create();
+
     ACE_MT(ACE_GUARD_RETURN(ACE_Recursive_Thread_Mutex, ace_mon, sm_mutex, L""));
 
     // Add the header
@@ -1851,8 +1939,6 @@
 
     info += L"</ConfigurationSettings>";
 
-    MG_FDOCONNECTION_MANAGER_TRY()
-
     // Show the contents of the provider info cache collection
     INT32 nIndex = 1;
     for (ProviderInfoCollection::iterator iterCol = m_ProviderInfoCollection.begin();iterCol != m_ProviderInfoCollection.end(); iterCol++)
@@ -1993,10 +2079,10 @@
         info += L"</Provider>\n";
     }
 
+    info += L"</FdoCacheInformation>\n";
+
     MG_FDOCONNECTION_MANAGER_CATCH(L"MgFdoConnectionManager.GetFdoCacheInfo")
 
-    info += L"</FdoCacheInformation>\n";
-
     return info;
 }
 
@@ -2059,12 +2145,16 @@
 
 bool MgFdoConnectionManager::SetCachedFdoConnectionAsInvalid(MgResourceIdentifier* resource)
 {
-    ACE_MT(ACE_GUARD_RETURN(ACE_Recursive_Thread_Mutex, ace_mon, sm_mutex, false));
-
     bool success = false;
 
     MG_FDOCONNECTION_MANAGER_TRY()
 
+    MgLogDetail logDetail(MgServiceType::FeatureService, MgLogDetail::InternalTrace, L"MgFdoConnectionManager.SetCachedFdoConnectionAsInvalid", mgStackParams);
+    logDetail.AddResourceIdentifier(L"Resource", resource);
+    logDetail.Create();
+
+    ACE_MT(ACE_GUARD_RETURN(ACE_Recursive_Thread_Mutex, ace_mon, sm_mutex, false));
+
     STRING resId;
 
     if (NULL != resource)

Modified: sandbox/adsk/2.3r/Server/src/Common/Manager/FdoConnectionManager.h
===================================================================
--- sandbox/adsk/2.3r/Server/src/Common/Manager/FdoConnectionManager.h	2011-02-04 21:38:17 UTC (rev 5518)
+++ sandbox/adsk/2.3r/Server/src/Common/Manager/FdoConnectionManager.h	2011-02-04 23:08:42 UTC (rev 5519)
@@ -200,6 +200,8 @@
 
 class MG_SERVER_MANAGER_API MgFdoConnectionManager : public MgGuardDisposable
 {
+    friend class MgCacheManager;
+
     DECLARE_CLASSNAME(MgFdoConnectionManager)
 
 public:



More information about the mapguide-commits mailing list