Author: mreutegg Date: Thu May 22 19:24:04 2014 New Revision: 1596945 URL: http://svn.apache.org/r1596945 Log: OAK-1814: RevisionComparator my incorrectly report a revision as FUTURE
Modified: jackrabbit/oak/branches/1.0/ (props changed) jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Revision.java jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/RevisionTest.java Propchange: jackrabbit/oak/branches/1.0/ ------------------------------------------------------------------------------ Merged /jackrabbit/oak/trunk:r1594237 Modified: jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java?rev=1596945&r1=1596944&r2=1596945&view=diff ============================================================================== --- jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java (original) +++ jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java Thu May 22 19:24:04 2014 @@ -119,7 +119,7 @@ public final class DocumentNodeStore * How long to remember the relative order of old revision of all cluster * nodes, in milliseconds. The default is one hour. */ - private static final int REMEMBER_REVISION_ORDER_MILLIS = 60 * 60 * 1000; + static final int REMEMBER_REVISION_ORDER_MILLIS = 60 * 60 * 1000; /** * The document store (might be used by multiple node stores). Modified: jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Revision.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Revision.java?rev=1596945&r1=1596944&r2=1596945&view=diff ============================================================================== --- jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Revision.java (original) +++ jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Revision.java Thu May 22 19:24:04 2014 @@ -572,6 +572,10 @@ public class Revision { Revision getRevisionSeen(Revision r) { List<RevisionRange> list = map.get(r.getClusterId()); if (list == null) { + if (r.getTimestamp() <= oldestTimestamp) { + // old revision with already purged range + return null; + } if (r.getClusterId() != currentClusterNodeId) { // this is from a cluster node we did not see yet // see also OAK-1170 Modified: jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java?rev=1596945&r1=1596944&r2=1596945&view=diff ============================================================================== --- jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java (original) +++ jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java Thu May 22 19:24:04 2014 @@ -49,11 +49,14 @@ import org.apache.jackrabbit.oak.spi.com import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry; import org.apache.jackrabbit.oak.spi.state.NodeBuilder; import org.apache.jackrabbit.oak.spi.state.NodeState; +import org.apache.jackrabbit.oak.stats.Clock; +import org.junit.After; import org.junit.Test; import com.google.common.collect.Iterables; import static org.apache.jackrabbit.oak.api.CommitFailedException.CONSTRAINT; +import static org.apache.jackrabbit.oak.plugins.document.Collection.NODES; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -62,6 +65,11 @@ import static org.junit.Assert.fail; public class DocumentNodeStoreTest { + @After + public void tearDown() { + Revision.resetClockToDefault(); + } + // OAK-1254 @Test public void backgroundRead() throws Exception { @@ -337,6 +345,52 @@ public class DocumentNodeStoreTest { ns.dispose(); } + // OAK-1814 + @Test + public void visibilityAfterRevisionComparatorPurge() throws Exception { + Clock clock = new Clock.Virtual(); + clock.waitUntil(System.currentTimeMillis()); + Revision.setClock(clock); + MemoryDocumentStore docStore = new MemoryDocumentStore(); + DocumentNodeStore nodeStore1 = new DocumentMK.Builder() + .setDocumentStore(docStore).setClusterId(1) + .setAsyncDelay(0).clock(clock).getNodeStore(); + nodeStore1.runBackgroundOperations(); + DocumentNodeStore nodeStore2 = new DocumentMK.Builder() + .setDocumentStore(docStore).setClusterId(2) + .setAsyncDelay(0).clock(clock).getNodeStore(); + DocumentNodeStore nodeStore3 = new DocumentMK.Builder() + .setDocumentStore(docStore).setClusterId(3) + .setAsyncDelay(0).clock(clock).getNodeStore(); + + NodeDocument doc = docStore.find(NODES, Utils.getIdFromPath("/")); + assertNotNull(doc); + Revision created = doc.getLocalDeleted().firstKey(); + assertEquals(1, created.getClusterId()); + + clock.waitUntil(System.currentTimeMillis() + + DocumentNodeStore.REMEMBER_REVISION_ORDER_MILLIS / 2); + + NodeBuilder builder = nodeStore2.getRoot().builder(); + builder.setProperty("prop", "value"); + nodeStore2.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY); + nodeStore2.runBackgroundOperations(); + + clock.waitUntil(System.currentTimeMillis() + + DocumentNodeStore.REMEMBER_REVISION_ORDER_MILLIS + 1000); + nodeStore3.runBackgroundOperations(); + + doc = docStore.find(NODES, Utils.getIdFromPath("/")); + assertNotNull(doc); + NodeState state = doc.getNodeAtRevision(nodeStore3, + nodeStore3.getHeadRevision(), null); + assertNotNull(state); + + nodeStore1.dispose(); + nodeStore2.dispose(); + nodeStore3.dispose(); + } + private static class TestHook extends EditorHook { TestHook(final String prefix) { Modified: jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/RevisionTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/RevisionTest.java?rev=1596945&r1=1596944&r2=1596945&view=diff ============================================================================== --- jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/RevisionTest.java (original) +++ jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/RevisionTest.java Thu May 22 19:24:04 2014 @@ -297,6 +297,32 @@ public class RevisionTest { assertEquals(new Revision(0x30, 0, 0), comp.getRevisionSeen(r21)); } + // OAK-1814 + @Test + public void seenAtAfterPurge() throws Exception { + RevisionComparator comp = new RevisionComparator(1); + + // some revisions from another cluster node + Revision r1 = new Revision(0x01, 0, 2); + Revision r2 = new Revision(0x02, 0, 2); + + // make them visible + comp.add(r1, new Revision(0x01, 0, 0)); + comp.add(r2, new Revision(0x02, 0, 0)); + + comp.purge(0x01); + + // null indicates older than earliest range + assertNull(comp.getRevisionSeen(r1)); + // r2 is still seen at 0x02 + assertEquals(new Revision(0x02, 0, 0), comp.getRevisionSeen(r2)); + + comp.purge(0x02); + + // now also r2 is considered old + assertNull(comp.getRevisionSeen(r2)); + } + @Test public void uniqueRevision2() throws Exception { List<Thread> threads = new ArrayList<Thread>();