From 9898a4c2004cefe40877d8ec44e050cb0730038e Mon Sep 17 00:00:00 2001 From: Alan Davis Date: Fri, 16 May 2014 20:07:48 +0000 Subject: [PATCH] Merged HEAD-BUG-FIX (4.3/Cloud) to HEAD (4.3/Cloud) 69947: Merged V4.2-BUG-FIX (4.2.3) to HEAD-BUG-FIX (4.3/Cloud) 69861: MNT-11371: Alfresco unable to bootstrap due to LockTryExceptions following an upgrade from 3.4.8 -> 3.4.13 -> 4.0.2 to either 4.1.8 or 4.2.1 Merged 4.1.N to V4.2.N (4.2.3) 69858: MNT-11371: Alfresco unable to bootstrap due to LockTryExceptions following an upgrade from 3.4.8 -> 3.4.13 -> 4.0.2 to either 4.1.8 or 4.2.1 Additional boolean parameter 'haveWriteLock' has been added to 'MessageServiceImpl.getResourceBundleBaseNames()' method. It serves to avoid unlocking external write locks. The method still assumes that read lock is acquired if 'haveWriteLock=false'. Read lock will be upgraded to write lock only if 'haveWriteLock' parameter is equal to false git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@70463 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../repo/i18n/MessageServiceImpl.java | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/source/java/org/alfresco/repo/i18n/MessageServiceImpl.java b/source/java/org/alfresco/repo/i18n/MessageServiceImpl.java index b42f3b09ba..dfe9216bcd 100644 --- a/source/java/org/alfresco/repo/i18n/MessageServiceImpl.java +++ b/source/java/org/alfresco/repo/i18n/MessageServiceImpl.java @@ -184,7 +184,7 @@ public class MessageServiceImpl implements MessageService LockHelper.tryLock(readLock, tryLockTimeout, "getting resource bundle base names in 'MessageServiceImpl.registerResourceBundle()'"); try { - tenantResourceBundleBaseNames = getResourceBundleBaseNames(tenantDomain); + tenantResourceBundleBaseNames = getResourceBundleBaseNames(tenantDomain, false); } finally { @@ -287,7 +287,7 @@ public class MessageServiceImpl implements MessageService // all locales loadedResourceBundlesForAllLocales = getLoadedResourceBundles(tenantDomain); cachedMessagesForAllLocales = getMessages(tenantDomain); - resourceBundleBaseNamesForAllLocales = getResourceBundleBaseNames(tenantDomain); + resourceBundleBaseNamesForAllLocales = getResourceBundleBaseNames(tenantDomain, false); } finally { @@ -405,7 +405,7 @@ public class MessageServiceImpl implements MessageService tenantCachedMessages = getMessages(tenantDomain); props = tenantCachedMessages.get(locale); - tenantResourceBundleBaseNames = getResourceBundleBaseNames(tenantDomain); + tenantResourceBundleBaseNames = getResourceBundleBaseNames(tenantDomain, false); loadedBundleCount = tenantResourceBundleBaseNames.size(); } finally @@ -451,7 +451,7 @@ public class MessageServiceImpl implements MessageService try { // get registered resource bundles - Set resBundleBaseNames = getResourceBundleBaseNames(tenantDomain); + Set resBundleBaseNames = getResourceBundleBaseNames(tenantDomain, true); int count = 0; @@ -595,7 +595,7 @@ public class MessageServiceImpl implements MessageService LockHelper.tryLock(readLock, tryLockTimeout, "getting resource bundle base names in 'MessageServiceImpl.getRegisteredBundles()'"); try { - return getResourceBundleBaseNames(getTenantDomain()); + return getResourceBundleBaseNames(getTenantDomain(), false); } finally { @@ -603,7 +603,7 @@ public class MessageServiceImpl implements MessageService } } - private Set getResourceBundleBaseNames(String tenantDomain) + private Set getResourceBundleBaseNames(String tenantDomain, boolean haveWriteLock) { // Assume a read lock is present Set resourceBundleBaseNames = resourceBundleBaseNamesCache.get(tenantDomain); @@ -611,10 +611,14 @@ public class MessageServiceImpl implements MessageService { return resourceBundleBaseNames; } - - // They are not there. Upgrade to the write lock. - readLock.unlock(); - LockHelper.tryLock(writeLock, tryLockTimeout, "getting cached resource bundle base names by tenant domain in 'MessageServiceImpl.getRegisteredBundles()'"); + + if (!haveWriteLock) + { + // They are not there. Upgrade to the write lock. + readLock.unlock(); + LockHelper.tryLock(writeLock, tryLockTimeout, "getting cached resource bundle base names by tenant domain in 'MessageServiceImpl.getRegisteredBundles()'"); + } + try { resourceBundleBaseNames = resourceBundleBaseNamesCache.get(tenantDomain); @@ -627,8 +631,11 @@ public class MessageServiceImpl implements MessageService } finally { - writeLock.unlock(); - LockHelper.tryLock(readLock, tryLockTimeout, "upgrading to read lock in MessageServiceImpl.getResourceBundleBaseNames()"); + if (!haveWriteLock) + { + writeLock.unlock(); + LockHelper.tryLock(readLock, tryLockTimeout, "upgrading to read lock in MessageServiceImpl.getResourceBundleBaseNames()"); + } } if (resourceBundleBaseNames == null)