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 2019/08/28 07:13:59 UTC

svn commit: r1866022 - in /jackrabbit/oak/trunk: oak-api/src/main/java/org/apache/jackrabbit/oak/api/ oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/ oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore...

Author: amitj
Date: Wed Aug 28 07:13:59 2019
New Revision: 1866022

URL: http://svn.apache.org/viewvc?rev=1866022&view=rev
Log:
OAK-8578: Introduce API to check whether blob inlined in Id
OAK-8552: Minimize network calls required when creating a direct download URI

Add a new method #isInlined to Blob class to check if the external blob is id inlined

Modified:
    jackrabbit/oak/trunk/oak-api/src/main/java/org/apache/jackrabbit/oak/api/Blob.java
    jackrabbit/oak/trunk/oak-api/src/main/java/org/apache/jackrabbit/oak/api/package-info.java
    jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/BlobStoreBlob.java
    jackrabbit/oak/trunk/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStoreTest.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBlob.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/BlobIdRecordTest.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ExternalBlobIT.java
    jackrabbit/oak/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlob.java
    jackrabbit/oak/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/value/jcr/BinaryImpl.java
    jackrabbit/oak/trunk/oak-store-spi/src/test/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlobTest.java

Modified: jackrabbit/oak/trunk/oak-api/src/main/java/org/apache/jackrabbit/oak/api/Blob.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-api/src/main/java/org/apache/jackrabbit/oak/api/Blob.java?rev=1866022&r1=1866021&r2=1866022&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-api/src/main/java/org/apache/jackrabbit/oak/api/Blob.java (original)
+++ jackrabbit/oak/trunk/oak-api/src/main/java/org/apache/jackrabbit/oak/api/Blob.java Wed Aug 28 07:13:59 2019
@@ -87,4 +87,12 @@ public interface Blob {
      */
     @Nullable
     String getContentIdentity();
+
+    /**
+     * Checks if the external blob is inlined in the id itself
+     * @return
+     */
+    default boolean isInlined() {
+        return false;
+    }
 }

Modified: jackrabbit/oak/trunk/oak-api/src/main/java/org/apache/jackrabbit/oak/api/package-info.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-api/src/main/java/org/apache/jackrabbit/oak/api/package-info.java?rev=1866022&r1=1866021&r2=1866022&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-api/src/main/java/org/apache/jackrabbit/oak/api/package-info.java (original)
+++ jackrabbit/oak/trunk/oak-api/src/main/java/org/apache/jackrabbit/oak/api/package-info.java Wed Aug 28 07:13:59 2019
@@ -18,7 +18,7 @@
 /**
  * Oak repository API
  */
-@Version("3.2.0")
+@Version("3.3.0")
 package org.apache.jackrabbit.oak.api;
 
 import org.osgi.annotation.versioning.Version;

Modified: jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/BlobStoreBlob.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/BlobStoreBlob.java?rev=1866022&r1=1866021&r2=1866022&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/BlobStoreBlob.java (original)
+++ jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/BlobStoreBlob.java Wed Aug 28 07:13:59 2019
@@ -21,6 +21,7 @@ package org.apache.jackrabbit.oak.plugin
 import java.io.IOException;
 import java.io.InputStream;
 
+import org.apache.jackrabbit.oak.plugins.blob.datastore.InMemoryDataRecord;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.apache.jackrabbit.oak.api.Blob;
 import org.jetbrains.annotations.NotNull;
@@ -79,6 +80,11 @@ public class BlobStoreBlob implements Bl
         return blobId;
     }
 
+    @Override
+    public boolean isInlined() {
+        return InMemoryDataRecord.isInstance(blobId);
+    }
+
     public String getBlobId() {
         return blobId;
     }

Modified: jackrabbit/oak/trunk/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStoreTest.java?rev=1866022&r1=1866021&r2=1866022&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStoreTest.java (original)
+++ jackrabbit/oak/trunk/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStoreTest.java Wed Aug 28 07:13:59 2019
@@ -39,6 +39,7 @@ import org.apache.jackrabbit.core.data.D
 import org.apache.jackrabbit.core.data.DataRecord;
 import org.apache.jackrabbit.core.data.DataStore;
 import org.apache.jackrabbit.core.data.DataStoreException;
+import org.apache.jackrabbit.oak.plugins.blob.BlobStoreBlob;
 import org.apache.jackrabbit.oak.spi.blob.AbstractBlobStoreTest;
 import org.apache.jackrabbit.oak.spi.blob.BlobStoreInputStream;
 import org.apache.jackrabbit.oak.spi.blob.stats.BlobStatsCollector;
@@ -99,6 +100,9 @@ public class DataStoreBlobStoreTest exte
         //Check for BlobStore methods
         assertEquals(maxInlineSize, ds.getBlobLength(dr.getIdentifier().toString()));
         assertEquals(dr.getIdentifier().toString(), BlobId.of(ds.writeBlob(new ByteArrayInputStream(data))).blobId);
+
+        BlobStoreBlob blob = new BlobStoreBlob(ds, dr.getIdentifier().toString());
+        assertTrue(blob.isInlined());
     }
 
     @Test
@@ -133,6 +137,9 @@ public class DataStoreBlobStoreTest exte
 //        assertTrue(ds.getInputStream(dr.getIdentifier().toString()) instanceof BufferedInputStream);
         assertEquals(actualSize, ds.getBlobLength(dr.getIdentifier().toString()));
         assertEquals(testDI.toString(), BlobId.of(ds.writeBlob(new ByteArrayInputStream(data))).blobId);
+
+        BlobStoreBlob blob = new BlobStoreBlob(ds, dr.getIdentifier().toString());
+        assertFalse(blob.isInlined());
     }
 
     @Test

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBlob.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBlob.java?rev=1866022&r1=1866021&r2=1866022&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBlob.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBlob.java Wed Aug 28 07:13:59 2019
@@ -31,6 +31,7 @@ import java.util.Set;
 
 import org.apache.jackrabbit.oak.api.Blob;
 import org.apache.jackrabbit.oak.plugins.blob.BlobStoreBlob;
+import org.apache.jackrabbit.oak.plugins.blob.datastore.InMemoryDataRecord;
 import org.apache.jackrabbit.oak.plugins.memory.AbstractBlob;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.jetbrains.annotations.NotNull;
@@ -140,6 +141,11 @@ public class SegmentBlob extends Record
         return null;
     }
 
+    @Override
+    public boolean isInlined() {
+        return isExternal() && InMemoryDataRecord.isInstance(getBlobId());
+    }
+
     public boolean isExternal() {
         Segment segment = getSegment();
         byte head = segment.readByte(getRecordNumber());

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/BlobIdRecordTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/BlobIdRecordTest.java?rev=1866022&r1=1866021&r2=1866022&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/BlobIdRecordTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/BlobIdRecordTest.java Wed Aug 28 07:13:59 2019
@@ -20,6 +20,7 @@ package org.apache.jackrabbit.oak.segmen
 import static org.apache.jackrabbit.oak.segment.DefaultSegmentWriterBuilder.defaultSegmentWriterBuilder;
 import static org.apache.jackrabbit.oak.segment.file.FileStoreBuilder.fileStoreBuilder;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 
 import java.io.File;
 import java.io.IOException;
@@ -129,6 +130,7 @@ public class BlobIdRecordTest {
             byte[] content = new byte[Segment.MEDIUM_LIMIT + 1];
             SegmentBlob sb = new SegmentBlob(ss.getBlobStore(), sw.writeBlob(new ArrayBasedBlob(content)));
             assertRecordTypeEquals(sb, RecordType.BLOB_ID);
+            assertFalse(sb.isInlined());
         }
     }
 
@@ -139,6 +141,7 @@ public class BlobIdRecordTest {
             byte[] content = new byte[Segment.MEDIUM_LIMIT + 1];
             SegmentBlob sb = new SegmentBlob(ss.getBlobStore(), sw.writeBlob(new ArrayBasedBlob(content)));
             assertRecordTypeEquals(sb, RecordType.BLOB_ID);
+            assertFalse(sb.isInlined());
         }
     }
 

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ExternalBlobIT.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ExternalBlobIT.java?rev=1866022&r1=1866021&r2=1866022&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ExternalBlobIT.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ExternalBlobIT.java Wed Aug 28 07:13:59 2019
@@ -21,6 +21,7 @@ package org.apache.jackrabbit.oak.segmen
 import static org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions.defaultGCOptions;
 import static org.apache.jackrabbit.oak.segment.file.FileStoreBuilder.fileStoreBuilder;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
@@ -86,6 +87,8 @@ public class ExternalBlobIT {
         Blob b1 = testCreateAndRead(createBlob(fds.getMinRecordLength()-2));
         assertTrue(b1 instanceof SegmentBlob);
         assertNull(((SegmentBlob) b1).getBlobId());
+        assertFalse(((SegmentBlob) b1).isExternal());
+        assertFalse(b1.isInlined());
 
         //Test for Blob which need to be pushed to BlobStore
         byte[] data2 = new byte[Segment.MEDIUM_LIMIT + 1];
@@ -94,6 +97,7 @@ public class ExternalBlobIT {
         assertTrue(b2 instanceof SegmentBlob);
         assertNotNull(b2.getReference());
         assertEquals(b2.getContentIdentity(), ((SegmentBlob) b2).getBlobId());
+        assertFalse(b2.isInlined());
 
         InputStream is = dbs.getInputStream(((SegmentBlob) b2).getBlobId());
         assertNotNull(IOUtils.contentEquals(new ByteArrayInputStream(data2), is));

Modified: jackrabbit/oak/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlob.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlob.java?rev=1866022&r1=1866021&r2=1866022&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlob.java (original)
+++ jackrabbit/oak/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlob.java Wed Aug 28 07:13:59 2019
@@ -79,6 +79,11 @@ public abstract class AbstractBlob imple
                 public long length() {
                     return blob.length();
                 }
+
+                @Override public boolean isInlined() {
+                    return blob.isInlined();
+                }
+
                 @NotNull
                 @Override
                 public InputStream getNewStream() {

Modified: jackrabbit/oak/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/value/jcr/BinaryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/value/jcr/BinaryImpl.java?rev=1866022&r1=1866021&r2=1866022&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/value/jcr/BinaryImpl.java (original)
+++ jackrabbit/oak/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/value/jcr/BinaryImpl.java Wed Aug 28 07:13:59 2019
@@ -93,7 +93,7 @@ class BinaryImpl implements ReferenceBin
     @Override
     public URI getURI(@NotNull BinaryDownloadOptions downloadOptions)
             throws RepositoryException {
-        if (null == getReference()) {
+        if (value.getBlob().isInlined()) {
             // Binary is inlined, we cannot return a URI for it
             return null;
         }

Modified: jackrabbit/oak/trunk/oak-store-spi/src/test/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlobTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-spi/src/test/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlobTest.java?rev=1866022&r1=1866021&r2=1866022&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-spi/src/test/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlobTest.java (original)
+++ jackrabbit/oak/trunk/oak-store-spi/src/test/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlobTest.java Wed Aug 28 07:13:59 2019
@@ -43,6 +43,8 @@ public class AbstractBlobTest {
         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));
+        assertFalse(a2.isInlined());
+        assertFalse(b2.isInlined());
     }
 
     @Test