You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by mr...@apache.org on 2014/04/24 16:14:22 UTC

svn commit: r1589741 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/document/Revision.java test/java/org/apache/jackrabbit/oak/plugins/document/RevisionTest.java

Author: mreutegg
Date: Thu Apr 24 14:14:22 2014
New Revision: 1589741

URL: http://svn.apache.org/r1589741
Log:
OAK-1727: Cross foreign cluster revision comparison may be wrong

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Revision.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/RevisionTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Revision.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Revision.java?rev=1589741&r1=1589740&r2=1589741&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Revision.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Revision.java Thu Apr 24 14:14:22 2014
@@ -521,9 +521,14 @@ public class Revision {
             if (range1 == FUTURE && range2 == FUTURE) {
                 return o1.compareRevisionTimeThenClusterId(o2);
             }
-            if (range1 == null || range2 == null) {
+            if (range1 == null && range2 == null) {
                 return o1.compareRevisionTimeThenClusterId(o2);
             }
+            if (range1 == null) {
+                return -1;
+            } else if (range2 == null) {
+                return 1;
+            }
             int comp = range1.compareRevisionTimeThenClusterId(range2);
             if (comp != 0) {
                 return comp;

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/RevisionTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/RevisionTest.java?rev=1589741&r1=1589740&r2=1589741&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/RevisionTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/RevisionTest.java Thu Apr 24 14:14:22 2014
@@ -221,6 +221,35 @@ public class RevisionTest {
         assertTrue(comp.compare(r1c2, r2c1) < 0);
     }
 
+    // OAK-1727
+    @Test
+    public void clusterCompare2() {
+        RevisionComparator comp = new RevisionComparator(1);
+
+        comp.add(Revision.fromString("r3-0-1"), Revision.fromString("r1-1-0"));
+
+        Revision r1 = Revision.fromString("r1-0-2");
+        Revision r2 = Revision.fromString("r4-0-2");
+
+        // cluster sync
+        Revision c1sync = Revision.fromString("r5-0-1");
+        comp.add(c1sync,  Revision.fromString("r2-0-0"));
+        Revision c2sync = Revision.fromString("r4-1-2");
+        comp.add(c2sync,  Revision.fromString("r2-1-0"));
+        Revision c3sync = Revision.fromString("r2-0-3");
+        comp.add(c3sync,  Revision.fromString("r2-1-0"));
+
+        assertTrue(comp.compare(r1, r2) < 0);
+        assertTrue(comp.compare(r2, c2sync) < 0);
+        // same seen-at revision, but clusterId 2 < 3
+        assertTrue(comp.compare(c2sync, c3sync) < 0);
+
+        // this means, c3sync must be after r1 and r2
+        // because: r1 < r2 < c2sync < c3sync
+        assertTrue(comp.compare(r1, c3sync) < 0);
+        assertTrue(comp.compare(r2, c3sync) < 0);
+    }
+
     @Test
     public void revisionSeen() {
         RevisionComparator comp = new RevisionComparator(1);