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 to...@apache.org on 2016/08/02 09:50:13 UTC

svn commit: r1754858 - in /jackrabbit/oak/branches/1.4: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/ oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/

Author: tomekr
Date: Tue Aug  2 09:50:13 2016
New Revision: 1754858

URL: http://svn.apache.org/viewvc?rev=1754858&view=rev
Log:
OAK-4624: Optionally ignore missing blobs during sidegrade

Modified:
    jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java
    jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/InMemoryDataRecord.java
    jackrabbit/oak/branches/1.4/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/SafeDataStoreBlobStore.java

Modified: jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java?rev=1754858&r1=1754857&r2=1754858&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java (original)
+++ jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java Tue Aug  2 09:50:13 2016
@@ -74,9 +74,9 @@ public class DataStoreBlobStore implemen
         GarbageCollectableBlobStore {
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    private final DataStore delegate;
+    protected final DataStore delegate;
 
-    private BlobStatsCollector stats = BlobStatsCollector.NOOP;
+    protected BlobStatsCollector stats = BlobStatsCollector.NOOP;
 
     /**
      * If set to true then the blob length information would be encoded as part of blobId
@@ -523,7 +523,7 @@ public class DataStoreBlobStore implemen
 
     //~---------------------------------------------< Internal >
 
-    private InputStream getStream(String blobId) throws IOException {
+    protected InputStream getStream(String blobId) throws IOException {
         try {
             InputStream in = getDataRecord(blobId).getStream();
             if (!(in instanceof BufferedInputStream)){
@@ -535,7 +535,7 @@ public class DataStoreBlobStore implemen
         }
     }
 
-    private DataRecord getDataRecord(String blobId) throws DataStoreException {
+    protected DataRecord getDataRecord(String blobId) throws DataStoreException {
         DataRecord id;
         if (InMemoryDataRecord.isInstance(blobId)) {
             id = InMemoryDataRecord.getInstance(blobId);
@@ -590,7 +590,7 @@ public class DataStoreBlobStore implemen
         return dr.getIdentifier().toString();
     }
 
-    private String extractBlobId(String encodedBlobId) {
+    protected String extractBlobId(String encodedBlobId) {
         if (encodeLengthInId) {
             return BlobId.of(encodedBlobId).blobId;
         }

Modified: jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/InMemoryDataRecord.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/InMemoryDataRecord.java?rev=1754858&r1=1754857&r2=1754858&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/InMemoryDataRecord.java (original)
+++ jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/InMemoryDataRecord.java Tue Aug  2 09:50:13 2016
@@ -31,7 +31,7 @@ import org.slf4j.LoggerFactory;
 /**
  * Represents binary data which is backed by a byte[] (in memory).
  */
-class InMemoryDataRecord implements DataRecord {
+public class InMemoryDataRecord implements DataRecord {
 
     /**
      * Logger instance for this class
@@ -89,7 +89,7 @@ class InMemoryDataRecord implements Data
      * @param id DataRecord identifier
      * @return true if it can be converted
      */
-    static boolean isInstance(String id) {
+    public static boolean isInstance(String id) {
         return id.startsWith(PREFIX);
     }
 
@@ -98,7 +98,7 @@ class InMemoryDataRecord implements Data
      * @param id DataRecord identifier
      * @return the instance
      */
-    static InMemoryDataRecord getInstance(String id) throws IllegalArgumentException {
+    public static InMemoryDataRecord getInstance(String id) throws IllegalArgumentException {
         assert id.startsWith(PREFIX);
         id = id.substring(PREFIX.length());
         int len = id.length();

Modified: jackrabbit/oak/branches/1.4/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/SafeDataStoreBlobStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.4/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/SafeDataStoreBlobStore.java?rev=1754858&r1=1754857&r2=1754858&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.4/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/SafeDataStoreBlobStore.java (original)
+++ jackrabbit/oak/branches/1.4/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/SafeDataStoreBlobStore.java Tue Aug  2 09:50:13 2016
@@ -16,15 +16,29 @@
  */
 package org.apache.jackrabbit.oak.upgrade.cli.blob;
 
+import org.apache.jackrabbit.core.data.DataIdentifier;
+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.datastore.DataStoreBlobStore;
+import org.apache.jackrabbit.oak.plugins.blob.datastore.InMemoryDataRecord;
+import org.apache.jackrabbit.oak.spi.blob.stats.StatsCollectingStreams;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.annotation.Nonnull;
+import java.io.BufferedInputStream;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * This implementation of the DataStoreBlobStore won't throw an exception if
+ * it can't find blob with given id. The WARN message will be emitted instead
+ * and the empty InputStream will be returned.
+ */
 public class SafeDataStoreBlobStore extends DataStoreBlobStore {
 
     private static final Logger log = LoggerFactory.getLogger(SafeDataStoreBlobStore.class);
@@ -34,12 +48,55 @@ public class SafeDataStoreBlobStore exte
     }
 
     @Override
-    public InputStream getInputStream(final String encodedBlobId)  {
+    public String getReference(@Nonnull String encodedBlobId) {
+        checkNotNull(encodedBlobId);
+        String blobId = extractBlobId(encodedBlobId);
+        //Reference are not created for in memory record
+        if (InMemoryDataRecord.isInstance(blobId)) {
+            return null;
+        }
+
+        DataRecord record;
+        try {
+            record = delegate.getRecordIfStored(new DataIdentifier(blobId));
+            if (record != null) {
+                return record.getReference();
+            } else {
+                log.debug("No blob found for id [{}]", blobId);
+            }
+        } catch (DataStoreException e) {
+            log.warn("Unable to access the blobId for  [{}]", blobId, e);
+        }
+        return  null;
+    }
+
+
+    @Override
+    protected InputStream getStream(String blobId) throws IOException {
         try {
-            return super.getInputStream(encodedBlobId);
-        } catch(IOException e) {
-            log.warn("Missing blob: {}", encodedBlobId);
-            return new ByteArrayInputStream(new byte[0]);
+            DataRecord record = getDataRecord(blobId);
+            if (record == null) {
+                log.warn("No blob found for id [{}]", blobId);
+                return new ByteArrayInputStream(new byte[0]);
+            }
+            InputStream in = getDataRecord(blobId).getStream();
+            if (!(in instanceof BufferedInputStream)){
+                in = new BufferedInputStream(in);
+            }
+            return StatsCollectingStreams.wrap(stats, blobId, in);
+        } catch (DataStoreException e) {
+            throw new IOException(e);
+        }
+    }
+
+    @Override
+    protected DataRecord getDataRecord(String blobId) throws DataStoreException {
+        DataRecord id;
+        if (InMemoryDataRecord.isInstance(blobId)) {
+            id = InMemoryDataRecord.getInstance(blobId);
+        } else {
+            id = delegate.getRecordIfStored(new DataIdentifier(blobId));
         }
+        return id;
     }
 }
\ No newline at end of file