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 am...@apache.org on 2016/12/09 05:45:06 UTC

svn commit: r1773322 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlob.java test/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlobTest.java

Author: amitj
Date: Fri Dec  9 05:45:06 2016
New Revision: 1773322

URL: http://svn.apache.org/viewvc?rev=1773322&view=rev
Log:
OAK-5253: Optimize AbstractBlob#equal to not do content equals when possible

- Returning result of identity comparison in case identities non null

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlob.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlobTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlob.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlob.java?rev=1773322&r1=1773321&r2=1773322&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlob.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlob.java Fri Dec  9 05:45:06 2016
@@ -57,10 +57,11 @@ public abstract class AbstractBlob imple
         String ai = a.getContentIdentity();
         String bi = b.getContentIdentity();
 
-        //Check for identity first. If they are same then its
-        //definitely same blob. If not we need to check further.
-        if (ai != null && bi != null && ai.equals(bi)){
-            return true;
+        //Check for identities not null. If not null then the identity check suffices to confirm
+        // whether they are same blob or not as the identity is a content hash.
+        // If any of the identities is null we need to check further.
+        if (ai != null && bi != null) {
+            return ai.equals(bi);
         }
 
         try {

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlobTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlobTest.java?rev=1773322&r1=1773321&r2=1773322&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlobTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlobTest.java Fri Dec  9 05:45:06 2016
@@ -37,13 +37,35 @@ public class AbstractBlobTest {
     @Test
     public void blobComparisonBasedOnContentIdentity() throws Exception {
         byte[] data = bytes(100);
+        // Same data same id
         Blob a = new TestBlob(data, "id1", false);
         Blob b = new TestBlob(data, "id1", false);
         assertTrue(AbstractBlob.equal(a, b));
 
-        Blob a2 = new TestBlob(data, "id1", true);
-        Blob b2 = new TestBlob(data, "id2", true);
-        assertTrue("Blobs with different id but same content should match", AbstractBlob.equal(a2, b2));
+        // Same data diff ids (assumes that id is content hashed so takes a short cut)
+        a = new TestBlob(data, "id1", false);
+        b = new TestBlob(data, "id2", false);
+        assertFalse("Blob with diff id but same content should not match",
+            AbstractBlob.equal(a, b));
+
+        // Diff data diff ids
+        byte data2[] = bytes(100);
+        Blob a2 = new TestBlob(data, "id1", false);
+        Blob b2 = new TestBlob(data2, "id2", false);
+        assertFalse("Blobs with different id and diff content should not match",
+            AbstractBlob.equal(a2, b2));
+
+        // 2nd id null
+        Blob a3 = new TestBlob(data, "id1", true);
+        Blob b3 = new TestBlob(data, null, true);
+        assertTrue("Blobs with a null id but same content should match",
+            AbstractBlob.equal(a3, b3));
+
+        // 1st id null
+        Blob a4 = new TestBlob(data, null, true);
+        Blob b4 = new TestBlob(data, "id2", true);
+        assertTrue("Blobs with a null id but same content should match",
+            AbstractBlob.equal(a4, b4));
     }
 
     @Test