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 ch...@apache.org on 2016/06/07 11:40:33 UTC

svn commit: r1747197 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/document/ test/java/org/apache/jackrabbit/oak/plugins/document/

Author: chetanm
Date: Tue Jun  7 11:40:33 2016
New Revision: 1747197

URL: http://svn.apache.org/viewvc?rev=1747197&view=rev
Log:
OAK-4428 - Optimize RevisionVector methods

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Revision.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/RevisionVector.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/RevisionVectorTest.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=1747197&r1=1747196&r2=1747197&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 Tue Jun  7 11:40:33 2016
@@ -27,6 +27,9 @@ import static com.google.common.base.Pre
  */
 public final class Revision implements CacheValue {
 
+    //Extra 2 for those cases where counter or clusterId is 2 digit
+    final static int REV_STRING_APPROX_SIZE = Revision.newRevision(0).toString().length() + 2;
+
     static final int SHALLOW_MEMORY_USAGE = 32;
 
     private static volatile long lastTimestamp;

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/RevisionVector.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/RevisionVector.java?rev=1747197&r1=1747196&r2=1747197&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/RevisionVector.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/RevisionVector.java Tue Jun  7 11:40:33 2016
@@ -27,11 +27,9 @@ import javax.annotation.Nonnull;
 
 import com.google.common.collect.AbstractIterator;
 import com.google.common.collect.Iterators;
-import com.google.common.collect.Lists;
 import com.google.common.collect.PeekingIterator;
 import com.google.common.collect.Sets;
 import com.google.common.primitives.Ints;
-
 import org.apache.jackrabbit.oak.cache.CacheValue;
 import org.apache.jackrabbit.oak.plugins.document.util.Utils;
 
@@ -57,6 +55,9 @@ public final class RevisionVector implem
 
     private final Revision[] revisions;
 
+    //lazily initialized
+    private int hash;
+
     private RevisionVector(@Nonnull Revision[] revisions,
                            boolean checkUniqueClusterIds,
                            boolean sort) {
@@ -320,12 +321,16 @@ public final class RevisionVector implem
      * @return a string representation of this revision vector.
      */
     public String asString() {
-        StringBuilder sb = new StringBuilder();
-        String comma = "";
-        for (Revision r : revisions) {
-            sb.append(comma);
-            comma = ",";
-            r.toStringBuilder(sb);
+        int len = revisions.length;
+        if (len == 0) {
+            return "";
+        }
+        StringBuilder sb = new StringBuilder(len * Revision.REV_STRING_APPROX_SIZE + len - 1);
+        for (int i = 0; i < len; i++) {
+            if (i > 0) {
+                sb.append(',');
+            }
+            revisions[i].toStringBuilder(sb);
         }
         return sb.toString();
     }
@@ -339,9 +344,10 @@ public final class RevisionVector implem
      * @throws IllegalArgumentException if the string is malformed
      */
     public static RevisionVector fromString(String s) {
-        List<Revision> revisions = Lists.newArrayListWithCapacity(3);
-        for (String str : s.split(",")) {
-            revisions.add(Revision.fromString(str));
+        String[] list = s.split(",");
+        Revision[] revisions = new Revision[list.length];
+        for (int i = 0; i < list.length; i++) {
+            revisions[i] = Revision.fromString(list[i]);
         }
         return new RevisionVector(revisions);
     }
@@ -446,17 +452,24 @@ public final class RevisionVector implem
     }
 
     @Override
-    public boolean equals(Object obj) {
-        if (obj instanceof RevisionVector) {
-            RevisionVector other = (RevisionVector) obj;
-            return Arrays.equals(revisions, other.revisions);
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
         }
-        return false;
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        RevisionVector other = (RevisionVector) o;
+        return Arrays.equals(revisions, other.revisions);
     }
 
     @Override
     public int hashCode() {
-        return Arrays.hashCode(revisions);
+        if (hash == 0){
+            hash = Arrays.hashCode(revisions);
+        }
+        return hash;
     }
 
     //-------------------------< internal >-------------------------------------

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/RevisionVectorTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/RevisionVectorTest.java?rev=1747197&r1=1747196&r2=1747197&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/RevisionVectorTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/RevisionVectorTest.java Tue Jun  7 11:40:33 2016
@@ -321,6 +321,11 @@ public class RevisionVectorTest {
         assertNotEquals(rv1, rv2);
         rv2 = rv2.update(r12);
         assertEquals(rv1, rv2);
+
+        //Check basic cases which are short circuited
+        assertEquals(rv1, rv1);
+        assertNotEquals(rv1, null);
+        assertNotEquals(rv1, new Object());
     }
 
     @Test
@@ -328,6 +333,9 @@ public class RevisionVectorTest {
         RevisionVector rv1 = new RevisionVector();
         RevisionVector rv2 = new RevisionVector();
         assertEquals(rv1.hashCode(), rv2.hashCode());
+
+        //Check again once lazily initialized hash is initialized
+        assertEquals(rv1.hashCode(), rv2.hashCode());
         Revision r11 = new Revision(1, 0, 1);
         rv1 = rv1.update(r11);
         rv2 = rv2.update(r11);
@@ -382,4 +390,16 @@ public class RevisionVectorTest {
         rv = rv.update(r12);
         assertEquals(new RevisionVector(br11, r12), rv.asBranchRevision(1));
     }
+
+    @Test
+    public void fromString() throws Exception{
+        RevisionVector rv = new RevisionVector(
+                new Revision(1, 0, 1),
+                new Revision(2, 0, 2)
+        );
+
+        String rvstr = rv.asString();
+        RevisionVector rvFromStr = RevisionVector.fromString(rvstr);
+        assertEquals(rv, rvFromStr);
+    }
 }