diff --git a/config/alfresco/dbscripts/upgrade/2.2/org.hibernate.dialect.MySQLInnoDBDialect/AlfrescoSchemaUpdate-2.2-CleanNodeStatuses.sql b/config/alfresco/dbscripts/upgrade/2.2/org.hibernate.dialect.MySQLInnoDBDialect/AlfrescoSchemaUpdate-2.2-CleanNodeStatuses.sql index 8040433bba..613c5cd7be 100644 --- a/config/alfresco/dbscripts/upgrade/2.2/org.hibernate.dialect.MySQLInnoDBDialect/AlfrescoSchemaUpdate-2.2-CleanNodeStatuses.sql +++ b/config/alfresco/dbscripts/upgrade/2.2/org.hibernate.dialect.MySQLInnoDBDialect/AlfrescoSchemaUpdate-2.2-CleanNodeStatuses.sql @@ -40,10 +40,10 @@ INSERT INTO alf_node_status (protocol, identifier, guid, node_id, transaction_id ); DROP TABLE t_node_status; ---FOREACH alf_node_status.node_id system.upgrade.alf_node_status.batchsize +--FOREACH alf_transaction.id system.upgrade.alf_transaction.batchsize DELETE FROM alf_node_status WHERE node_id IS NULL -AND node_id >= ${LOWERBOUND} AND node_id <= ${UPPERBOUND}; +AND transaction_id >= ${LOWERBOUND} AND transaction_id <= ${UPPERBOUND}; --FOREACH alf_node_status.node_id system.upgrade.alf_node_status.batchsize UPDATE alf_node_status ns SET ns.protocol = diff --git a/config/alfresco/dbscripts/upgrade/2.2/org.hibernate.dialect.MySQLInnoDBDialect/upgrade-from-2.1.sql b/config/alfresco/dbscripts/upgrade/2.2/org.hibernate.dialect.MySQLInnoDBDialect/upgrade-from-2.1.sql index cb736f7498..de91e3c1d8 100644 --- a/config/alfresco/dbscripts/upgrade/2.2/org.hibernate.dialect.MySQLInnoDBDialect/upgrade-from-2.1.sql +++ b/config/alfresco/dbscripts/upgrade/2.2/org.hibernate.dialect.MySQLInnoDBDialect/upgrade-from-2.1.sql @@ -278,8 +278,12 @@ CREATE TABLE t_summary_nstat transaction_id BIGINT(20) DEFAULT NULL, PRIMARY KEY (node_id) ) TYPE=InnoDB; +--FOREACH alf_node_status.node_id system.upgrade.t_summary_nstat.batchsize INSERT INTO t_summary_nstat (node_id, transaction_id) - SELECT node_id, transaction_id FROM alf_node_status WHERE node_id IS NOT NULL; + SELECT node_id, transaction_id + FROM alf_node_status + WHERE node_id IS NOT NULL + AND node_id >= ${LOWERBOUND} AND node_id <= ${UPPERBOUND}; -- Copy data over --FOREACH alf_node.id system.upgrade.t_alf_node.batchsize diff --git a/config/alfresco/dbscripts/upgrade/2.2/org.hibernate.dialect.MySQLInnoDBDialect/upgrade-from-2.2SP1.sql b/config/alfresco/dbscripts/upgrade/2.2/org.hibernate.dialect.MySQLInnoDBDialect/upgrade-from-2.2SP1.sql index c983a33ebd..638c2c6711 100644 --- a/config/alfresco/dbscripts/upgrade/2.2/org.hibernate.dialect.MySQLInnoDBDialect/upgrade-from-2.2SP1.sql +++ b/config/alfresco/dbscripts/upgrade/2.2/org.hibernate.dialect.MySQLInnoDBDialect/upgrade-from-2.2SP1.sql @@ -70,8 +70,12 @@ CREATE TABLE t_summary_nstat transaction_id BIGINT(20) DEFAULT NULL, PRIMARY KEY (node_id) ) TYPE=InnoDB; +--FOREACH alf_node_status.node_id system.upgrade.t_summary_nstat.batchsize INSERT INTO t_summary_nstat (node_id, transaction_id) - SELECT node_id, transaction_id FROM alf_node_status WHERE node_id IS NOT NULL; + SELECT node_id, transaction_id + FROM alf_node_status + WHERE node_id IS NOT NULL + AND node_id >= ${LOWERBOUND} AND node_id <= ${UPPERBOUND}; -- Copy data over --FOREACH alf_node.id system.upgrade.t_alf_node.batchsize diff --git a/source/java/org/alfresco/repo/node/index/AbstractReindexComponent.java b/source/java/org/alfresco/repo/node/index/AbstractReindexComponent.java index 980bd51293..c5a56fd685 100644 --- a/source/java/org/alfresco/repo/node/index/AbstractReindexComponent.java +++ b/source/java/org/alfresco/repo/node/index/AbstractReindexComponent.java @@ -1108,7 +1108,7 @@ public abstract class AbstractReindexComponent implements IndexRecovery // to prevent the queue from getting locked up. if (lastRunnable == currentRunnable) { - if (currentTimestamp - lastTimestamp > 60E9) + if (currentTimestamp - lastTimestamp > 600E9) { try @@ -1122,9 +1122,9 @@ public abstract class AbstractReindexComponent implements IndexRecovery } else { - loggerOnThread.info("Terminating reindex thread for inactivity: " + currentRunnable); - reindexThreadQueue.remove(currentRunnable); - currentRunnable.kill(); + loggerOnThread.warn("Detected reindex thread inactivity: " + currentRunnable); + //reindexThreadQueue.remove(currentRunnable); + //currentRunnable.kill(); } // Reset lastRunnable = null; diff --git a/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneIndexerImpl.java b/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneIndexerImpl.java index d9add53798..fc6d6ef05d 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneIndexerImpl.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneIndexerImpl.java @@ -1608,10 +1608,6 @@ public class ADMLuceneIndexerImpl extends AbstractLuceneIndexerImpl imp remainingCount = count - done; return done; } - catch (LuceneIndexException e) - { - return 0; - } finally { if (writer != null) diff --git a/source/java/org/alfresco/repo/version/BaseVersionStoreTest.java b/source/java/org/alfresco/repo/version/BaseVersionStoreTest.java index 68186dae22..2e96ee5a88 100644 --- a/source/java/org/alfresco/repo/version/BaseVersionStoreTest.java +++ b/source/java/org/alfresco/repo/version/BaseVersionStoreTest.java @@ -221,15 +221,15 @@ public abstract class BaseVersionStoreTest extends BaseSpringTest */ protected NodeRef createNewVersionableNode() { - return createNode(true); + return createNode(true, TEST_TYPE_QNAME); } protected NodeRef createNewNode() { - return createNode(false); + return createNode(false, TEST_TYPE_QNAME); } - protected NodeRef createNode(boolean versionable) + protected NodeRef createNode(boolean versionable, QName nodeType) { // Use this map to retrive the versionable nodes in later tests this.versionableNodes = new HashMap(); @@ -239,7 +239,7 @@ public abstract class BaseVersionStoreTest extends BaseSpringTest rootNodeRef, ContentModel.ASSOC_CHILDREN, QName.createQName("{test}MyVersionableNode"), - TEST_TYPE_QNAME, + nodeType, this.nodeProperties).getChildRef(); if (versionable) { @@ -263,7 +263,7 @@ public abstract class BaseVersionStoreTest extends BaseSpringTest nodeRef, TEST_CHILD_ASSOC_1, TEST_CHILD_ASSOC_1, - TEST_TYPE_QNAME, + nodeType, this.nodeProperties).getChildRef(); if (versionable) @@ -277,7 +277,7 @@ public abstract class BaseVersionStoreTest extends BaseSpringTest nodeRef, TEST_CHILD_ASSOC_2, TEST_CHILD_ASSOC_2, - TEST_TYPE_QNAME, + nodeType, this.nodeProperties).getChildRef(); if (versionable) @@ -293,7 +293,7 @@ public abstract class BaseVersionStoreTest extends BaseSpringTest rootNodeRef, ContentModel.ASSOC_CHILDREN, QName.createQName("{test}MyAssocNode"), - TEST_TYPE_QNAME, + nodeType, this.nodeProperties).getChildRef(); assertNotNull(assocNode); this.dbNodeService.createAssociation(nodeRef, assocNode, TEST_ASSOC); diff --git a/source/java/org/alfresco/repo/version/Version2ServiceImpl.java b/source/java/org/alfresco/repo/version/Version2ServiceImpl.java index 9f38d5c76e..8062942e3b 100644 --- a/source/java/org/alfresco/repo/version/Version2ServiceImpl.java +++ b/source/java/org/alfresco/repo/version/Version2ServiceImpl.java @@ -37,6 +37,7 @@ import org.alfresco.repo.version.common.VersionHistoryImpl; import org.alfresco.repo.version.common.VersionImpl; import org.alfresco.repo.version.common.VersionUtil; import org.alfresco.repo.version.common.VersionHistoryImpl.VersionComparatorAsc; +import org.alfresco.repo.version.common.versionlabel.SerialVersionLabelPolicy; import org.alfresco.service.cmr.repository.AspectMissingException; import org.alfresco.service.cmr.repository.AssociationRef; import org.alfresco.service.cmr.repository.ChildAssociationRef; @@ -50,6 +51,7 @@ import org.alfresco.service.cmr.version.VersionService; import org.alfresco.service.cmr.version.VersionServiceException; import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.RegexQNamePattern; +import org.alfresco.util.VersionNumber; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.extensions.surf.util.ParameterCheck; @@ -265,6 +267,10 @@ public class Version2ServiceImpl extends VersionServiceImpl implements VersionSe } else { + // ALF-3962 fix + // check for corrupted version histories that are marked with version label "0" + checkForCorruptedVersions(versionHistoryRef, nodeRef); + // Since we have an existing version history we should be able to lookup // the current version currentVersionRef = getCurrentVersionNodeRef(versionHistoryRef, nodeRef); @@ -684,6 +690,30 @@ public class Version2ServiceImpl extends VersionServiceImpl implements VersionSe } } + /** + * Gets all versions in version history + * + * @param versionHistoryRef the version history nodeRef + * @return list of all versions + */ + protected List getAllVersions(NodeRef versionHistoryRef) + { + List versionsAssoc = this.dbNodeService.getChildAssocs(versionHistoryRef, Version2Model.CHILD_QNAME_VERSIONS, RegexQNamePattern.MATCH_ALL); + + List versions = new ArrayList(versionsAssoc.size()); + + for (ChildAssociationRef versionAssoc : versionsAssoc) + { + String localName = versionAssoc.getQName().getLocalName(); + if (localName.indexOf(Version2Model.CHILD_VERSIONS+"-") != -1) // TODO - could remove this belts-and-braces, should match correctly above ! + { + versions.add(getVersion(versionAssoc.getChildRef())); + } + } + + return versions; + } + /** * Builds a version history object from the version history reference. *

@@ -703,18 +733,7 @@ public class Version2ServiceImpl extends VersionServiceImpl implements VersionSe VersionHistory versionHistory = null; - List versionsAssoc = this.dbNodeService.getChildAssocs(versionHistoryRef, Version2Model.CHILD_QNAME_VERSIONS, RegexQNamePattern.MATCH_ALL); - - List versions = new ArrayList(versionsAssoc.size()); - - for (ChildAssociationRef versionAssoc : versionsAssoc) - { - String localName = versionAssoc.getQName().getLocalName(); - if (localName.indexOf(Version2Model.CHILD_VERSIONS+"-") != -1) // TODO - could remove this belts-and-braces, should match correctly above ! - { - versions.add(getVersion(versionAssoc.getChildRef())); - } - } + List versions = getAllVersions(versionHistoryRef); Collections.sort(versions, versionComparatorAsc); @@ -879,6 +898,63 @@ public class Version2ServiceImpl extends VersionServiceImpl implements VersionSe return result; } + /** + * Check if versions are marked with invalid version label, if true > apply default serial version label (e.g. "1.0", "1.1") + * + * @param versionHistory a version histore node reference + * @param nodeRef a node reference + */ + private void checkForCorruptedVersions(NodeRef versionHistory, NodeRef nodeRef) + { + // get the current version label in live store + String versionLabel = (String) this.nodeService.getProperty(nodeRef, ContentModel.PROP_VERSION_LABEL); + + if (versionLabel != null && versionLabel.equals("0")) + { + // need to correct version labels + List versions = getAllVersions(versionHistory); + + // sort versions by node id + Collections.sort(versions, new Comparator() + { + + public int compare(Version v1, Version v2) + { + int result = v1.getFrozenModifiedDate().compareTo(v2.getFrozenModifiedDate()); + if (result == 0) + { + result = v1.getFrozenStateNodeRef().getId().compareTo(v2.getFrozenStateNodeRef().getId()); + } + return result; + } + + }); + + SerialVersionLabelPolicy serialVersionLabelPolicy = new SerialVersionLabelPolicy(); + QName classRef = this.nodeService.getType(nodeRef); + Version preceedingVersion = null; + + for (Version version : versions) + { + // re-calculate version label + versionLabel = serialVersionLabelPolicy.calculateVersionLabel(classRef, preceedingVersion, 0, version.getVersionProperties()); + + // update version with new version label + NodeRef versionNodeRef = new NodeRef(StoreRef.PROTOCOL_WORKSPACE, version.getFrozenStateNodeRef().getStoreRef().getIdentifier(), version.getFrozenStateNodeRef() + .getId()); + this.dbNodeService.setProperty(versionNodeRef, Version2Model.PROP_QNAME_VERSION_LABEL, versionLabel); + + version.getVersionProperties().put(VersionBaseModel.PROP_VERSION_LABEL, versionLabel); + + // remember preceding version + preceedingVersion = version; + } + + // update current version label in live store + this.nodeService.setProperty(nodeRef, ContentModel.PROP_VERSION_LABEL, versionLabel); + } + } + /** * @see org.alfresco.cms.version.VersionService#revert(NodeRef) */ diff --git a/source/java/org/alfresco/repo/version/VersionServiceImplTest.java b/source/java/org/alfresco/repo/version/VersionServiceImplTest.java index 08f6e2138b..7654f5ac20 100644 --- a/source/java/org/alfresco/repo/version/VersionServiceImplTest.java +++ b/source/java/org/alfresco/repo/version/VersionServiceImplTest.java @@ -1164,6 +1164,41 @@ public class VersionServiceImplTest extends BaseVersionStoreTest assertEquals(AccessStatus.DENIED, permissionService.hasPermission(versionNodeRef, PermissionService.READ)); } + public void testALF_3962() + { + NodeRef versionableNode = createNode(true, QName.createQName("http://www.alfresco.org/model/action/1.0", "action")); + // crete some versions of content without version label policy + createVersion(versionableNode); + createVersion(versionableNode); + createVersion(versionableNode); + + // corrupt versions + Collection versions = versionService.getVersionHistory(versionableNode).getAllVersions(); + + for (Version version : versions) + { + // update version with corrupted label + NodeRef versionNodeRef = new NodeRef(StoreRef.PROTOCOL_WORKSPACE, version.getFrozenStateNodeRef().getStoreRef().getIdentifier(), version.getFrozenStateNodeRef() + .getId()); + this.dbNodeService.setProperty(versionNodeRef, Version2Model.PROP_QNAME_VERSION_LABEL, "0"); + } + this.nodeService.setProperty(versionableNode, ContentModel.PROP_VERSION_LABEL, "0"); + + // should correct version labels + versionService.createVersion(versionableNode, this.versionProperties); + + versions = versionService.getVersionHistory(versionableNode).getAllVersions(); + + for (Version version : versions) + { + assertFalse(version.getVersionLabel().equals("0")); + } + + // check live node + assertFalse(this.nodeService.getProperty(versionableNode, ContentModel.PROP_VERSION_LABEL).toString().equals("0")); + + } + public static void main(String ... args) { try diff --git a/source/java/org/alfresco/repo/version/common/AbstractVersionServiceImpl.java b/source/java/org/alfresco/repo/version/common/AbstractVersionServiceImpl.java index fc28be35c3..4be290027f 100644 --- a/source/java/org/alfresco/repo/version/common/AbstractVersionServiceImpl.java +++ b/source/java/org/alfresco/repo/version/common/AbstractVersionServiceImpl.java @@ -31,6 +31,7 @@ import org.alfresco.repo.version.VersionServicePolicies.AfterCreateVersionPolicy import org.alfresco.repo.version.VersionServicePolicies.BeforeCreateVersionPolicy; import org.alfresco.repo.version.VersionServicePolicies.CalculateVersionLabelPolicy; import org.alfresco.repo.version.VersionServicePolicies.OnCreateVersionPolicy; +import org.alfresco.repo.version.common.versionlabel.SerialVersionLabelPolicy; import org.alfresco.service.cmr.dictionary.DictionaryService; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; @@ -236,8 +237,9 @@ public abstract class AbstractVersionServiceImpl Collection behaviours = this.calculateVersionLabelDelegate.getList(classRef); if (behaviours.size() == 0) { - // Default the version label to the version numbder - versionLabel = Integer.toString(versionNumber); + // Default the version label to the SerialVersionLabelPolicy + SerialVersionLabelPolicy defaultVersionLabelPolicy = new SerialVersionLabelPolicy(); + versionLabel = defaultVersionLabelPolicy.calculateVersionLabel(classRef, preceedingVersion, versionNumber, versionProperties); } else if (behaviours.size() == 1) {