diff --git a/search-services/alfresco-search/src/main/java/org/alfresco/solr/tracker/AbstractTracker.java b/search-services/alfresco-search/src/main/java/org/alfresco/solr/tracker/AbstractTracker.java index a9c337e1c..46e28f973 100644 --- a/search-services/alfresco-search/src/main/java/org/alfresco/solr/tracker/AbstractTracker.java +++ b/search-services/alfresco-search/src/main/java/org/alfresco/solr/tracker/AbstractTracker.java @@ -315,7 +315,17 @@ public abstract class AbstractTracker implements Tracker private void continueState() { - infoSrv.continueState(state); + + /* + * If a rollback is pending then skip advancing the tracker state to avoid + * continueState() jumping the commit time forward and skipping historical + * transactions. We still increment trackerCycles so the checkRepoAndIndexConsistency where initial repo/index consistency + * check is not triggered again after every rollback. + */ + if (!this.rollback) + { + infoSrv.continueState(state); + } state.incrementTrackerCycles(); } diff --git a/search-services/alfresco-search/src/test/java/org/alfresco/solr/tracker/MetadataTrackerTest.java b/search-services/alfresco-search/src/test/java/org/alfresco/solr/tracker/MetadataTrackerTest.java index db8dadf36..8f623f992 100644 --- a/search-services/alfresco-search/src/test/java/org/alfresco/solr/tracker/MetadataTrackerTest.java +++ b/search-services/alfresco-search/src/test/java/org/alfresco/solr/tracker/MetadataTrackerTest.java @@ -405,4 +405,17 @@ public class MetadataTrackerTest verify(this.metadataTracker, times(1)).doTrack("AnIterationId"); } + + @Test + public void trackDoesNotAdvanceStateWhenRollbackIsPending() throws Exception + { + TrackerState state = new TrackerState(); + metadataTracker.state = state; + metadataTracker.setRollback(true, new RuntimeException("simulated 403 error")); + + metadataTracker.track(); + + verify(srv, never()).continueState(any()); + assertEquals(1L, state.getTrackerCycles()); + } }