From e11febd09eaf5523108b94d37bcbc5f11cd7fb09 Mon Sep 17 00:00:00 2001 From: Tatyana Valkevych Date: Mon, 17 Aug 2015 11:47:37 +0000 Subject: [PATCH] Merged 5.0.N (5.0.3) to HEAD (5.1) (PARTIAL MERGE) 110088: Merged 5.0.2 (5.0.2) to 5.0.N (5.0.3) 110052: MNT-14579: TS starting in read-only mode after applying 5.0.2 build 64 - This intermittent issue was probably caused by the SysAdminParams.afterPropertiesSet checking for a valid dictionary. If this call took place too early, then it would never allow the system to be in read-write mode unless rebooted. - Removed the dictionary check from SysAdminParamsImpl; it is now only responsible for the 'server.allowWrite' property - Call the TransactionServiceImpl's read-write veto code if the 'server.allowWrite' property changes - Better logging when vetoes are placed but also when vetoes are removed git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@110214 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- config/alfresco/core-services-context.xml | 3 -- .../repo/admin/SysAdminParamsImpl.java | 29 +++++++------------ .../transaction/TransactionServiceImpl.java | 24 +++++++-------- .../TransactionServiceImplTest.java | 2 -- 4 files changed, 20 insertions(+), 38 deletions(-) diff --git a/config/alfresco/core-services-context.xml b/config/alfresco/core-services-context.xml index b63cc03de3..9267826f3f 100644 --- a/config/alfresco/core-services-context.xml +++ b/config/alfresco/core-services-context.xml @@ -241,9 +241,6 @@ - - - ${server.transaction.allow-writes} diff --git a/source/java/org/alfresco/repo/admin/SysAdminParamsImpl.java b/source/java/org/alfresco/repo/admin/SysAdminParamsImpl.java index e53b4d561a..e4d8835890 100644 --- a/source/java/org/alfresco/repo/admin/SysAdminParamsImpl.java +++ b/source/java/org/alfresco/repo/admin/SysAdminParamsImpl.java @@ -23,12 +23,13 @@ import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; +import org.alfresco.repo.transaction.TransactionServiceImpl; import org.alfresco.service.cmr.security.PermissionService; -import org.alfresco.service.license.LicenseService; +import org.alfresco.service.namespace.NamespaceService; +import org.alfresco.service.namespace.QName; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; @@ -41,6 +42,7 @@ public class SysAdminParamsImpl implements SysAdminParams, ApplicationContextAwa /** Token name to substitute current servers DNS name or TCP/IP address into a host name **/ private static final String TOKEN_LOCAL_NAME = "${localname}"; + private static final QName VETO = QName.createQName(NamespaceService.APP_MODEL_1_0_URI, "SysAdminParams"); /** The local server name to which the above token will expand. */ private final String localName; @@ -108,23 +110,12 @@ public class SysAdminParamsImpl implements SysAdminParams, ApplicationContextAwa @Override public void afterPropertiesSet() throws Exception { - if (this.allowWrite) - { - LicenseService licenseService = null; - try - { - licenseService = (LicenseService) this.ctx.getBean("licenseService"); - this.allowWrite = licenseService.isLicenseValid(); - if (logger.isInfoEnabled()) - { - logger.info("'allowWrite' being set to false: licenseService.isLicenseValid() returned false."); - } - } - catch (NoSuchBeanDefinitionException e) - { - // ignore - } - } + // Set the transaction read-write state by veto + // There is no need to attempt to check the dictionary or any other component as they will handle + // their own vetoes (MNT-14579) + // No logging is required here: it is done in the TransactionService code, already + TransactionServiceImpl transactionService = (TransactionServiceImpl) ctx.getBean("transactionService"); + transactionService.setAllowWrite(allowWrite, VETO); } /** diff --git a/source/java/org/alfresco/repo/transaction/TransactionServiceImpl.java b/source/java/org/alfresco/repo/transaction/TransactionServiceImpl.java index 356c33efb2..f71d1a917f 100644 --- a/source/java/org/alfresco/repo/transaction/TransactionServiceImpl.java +++ b/source/java/org/alfresco/repo/transaction/TransactionServiceImpl.java @@ -26,7 +26,6 @@ import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock; import javax.transaction.UserTransaction; -import org.alfresco.repo.admin.SysAdminParams; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; @@ -57,9 +56,6 @@ public class TransactionServiceImpl implements TransactionService private static final Log logger = LogFactory.getLog(TransactionServiceImpl.class); - // SysAdmin cache - used to cluster certain configuration parameters - private SysAdminParams sysAdminParams; - // Veto for allow write private Set writeVeto = new HashSet(); private final QName generalVetoName = QName.createQName(NamespaceService.APP_MODEL_1_0_URI, "GeneralVeto"); @@ -85,11 +81,6 @@ public class TransactionServiceImpl implements TransactionService this.transactionManager = transactionManager; } - public void setSysAdminParams(SysAdminParams sysAdminParams) - { - this.sysAdminParams = sysAdminParams; - } - /** * {@inheritDoc} */ @@ -99,7 +90,7 @@ public class TransactionServiceImpl implements TransactionService vetoReadLock.lock(); try { - return writeVeto.isEmpty() && this.sysAdminParams.getAllowWrite(); + return writeVeto.isEmpty(); } finally { @@ -138,20 +129,25 @@ public class TransactionServiceImpl implements TransactionService */ public void setAllowWrite(boolean allowWrite, QName nameOfVeto) { - if(logger.isDebugEnabled()) + if (logger.isDebugEnabled()) { - logger.debug("setAllowWrite:" + allowWrite + ", name of veto:" + nameOfVeto); + logger.debug("setAllowWrite:" + allowWrite + ". Name of veto:" + nameOfVeto); } vetoWriteLock.lock(); try { if(allowWrite) { - writeVeto.remove(nameOfVeto); + boolean removed = writeVeto.remove(nameOfVeto); + if (removed) + { + logger.warn("setAllowWrite:" + allowWrite + ". Removing veto on write operations: " + nameOfVeto); + } } else { writeVeto.add(nameOfVeto); + logger.warn("setAllowWrite:" + allowWrite + ". Applying veto on write operations: " + nameOfVeto); } } finally @@ -178,7 +174,7 @@ public class TransactionServiceImpl implements TransactionService } else { - return !writeVeto.isEmpty() || !this.sysAdminParams.getAllowWrite(); + return !writeVeto.isEmpty(); } } finally diff --git a/source/test-java/org/alfresco/repo/transaction/TransactionServiceImplTest.java b/source/test-java/org/alfresco/repo/transaction/TransactionServiceImplTest.java index 729c09edc5..4e8471b5ca 100644 --- a/source/test-java/org/alfresco/repo/transaction/TransactionServiceImplTest.java +++ b/source/test-java/org/alfresco/repo/transaction/TransactionServiceImplTest.java @@ -25,7 +25,6 @@ import javax.transaction.UserTransaction; import junit.framework.TestCase; import org.alfresco.model.ContentModel; -import org.alfresco.repo.admin.SysAdminParams; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.permissions.AccessDeniedException; import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; @@ -76,7 +75,6 @@ public class TransactionServiceImplTest extends TestCase transactionService = new TransactionServiceImpl(); transactionService.setTransactionManager(transactionManager); transactionService.setAllowWrite(true, vetoName); - transactionService.setSysAdminParams((SysAdminParams) ctx.getBean("sysAdminParams")); nodeService = (NodeService) ctx.getBean("dbNodeService"); authenticationService = (MutableAuthenticationService) ctx.getBean("AuthenticationService");