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