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 2017/08/11 10:23:45 UTC

svn commit: r1804767 - in /jackrabbit/oak/trunk/oak-run/src: main/java/org/apache/jackrabbit/oak/exporter/FSBlobSerializer.java test/java/org/apache/jackrabbit/oak/exporter/FSBlobSerializerTest.java

Author: chetanm
Date: Fri Aug 11 10:23:45 2017
New Revision: 1804767

URL: http://svn.apache.org/viewvc?rev=1804767&view=rev
Log:
OAK-6545 - Tooling to serialize NodeState as json along with blobs

Be resilient in handling error while serializing blobs. In case of
error the blob would be serialized with a value "*ERROR*-<blob id>"

Modified:
    jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/exporter/FSBlobSerializer.java
    jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/exporter/FSBlobSerializerTest.java

Modified: jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/exporter/FSBlobSerializer.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/exporter/FSBlobSerializer.java?rev=1804767&r1=1804766&r2=1804767&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/exporter/FSBlobSerializer.java (original)
+++ jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/exporter/FSBlobSerializer.java Fri Aug 11 10:23:45 2017
@@ -24,6 +24,8 @@ import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 
+import javax.annotation.Nonnull;
+
 import org.apache.jackrabbit.core.data.DataStoreException;
 import org.apache.jackrabbit.core.data.FileDataStore;
 import org.apache.jackrabbit.oak.api.Blob;
@@ -32,6 +34,9 @@ import org.apache.jackrabbit.oak.json.Bl
 import org.apache.jackrabbit.oak.plugins.blob.BlobStoreBlob;
 import org.apache.jackrabbit.oak.plugins.blob.datastore.DataStoreBlobStore;
 import org.apache.jackrabbit.oak.plugins.blob.datastore.OakFileDataStore;
+import org.apache.jackrabbit.oak.plugins.memory.AbstractBlob;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import static org.apache.commons.io.FileUtils.ONE_KB;
 
@@ -39,6 +44,8 @@ import static org.apache.commons.io.File
  * Serializer which stores blobs in a FileDataStore format
  */
 public class FSBlobSerializer extends BlobSerializer implements BlobDeserializer, Closeable {
+    private final Logger log = LoggerFactory.getLogger(getClass());
+    private static final String ERROR_MARKER = "*ERROR*-";
     private final File dir;
     private final int maxInlineSize;
     private final DataStoreBlobStore dataStore;
@@ -55,13 +62,11 @@ public class FSBlobSerializer extends Bl
 
     @Override
     public String serialize(Blob blob) {
-        try {
-            try (InputStream is = blob.getNewStream()) {
-                return dataStore.writeBlob(is);
-            }
-        } catch (IOException e) {
-            throw new RuntimeException("Error occurred while serializing Blob " +
-                    "with id " + blob.getContentIdentity(), e);
+        try (InputStream is = blob.getNewStream()) {
+            return dataStore.writeBlob(is);
+        } catch (Exception e) {
+            log.warn("Error occurred while serializing Blob with id {}", blob.getContentIdentity(), e);
+            return String.format("%s%s", ERROR_MARKER, blob.getContentIdentity());
         }
     }
 
@@ -75,9 +80,16 @@ public class FSBlobSerializer extends Bl
 
     @Override
     public Blob deserialize(String value) {
+        if (errorBlob(value)){
+            return new ErrorBlob(value);
+        }
         return new BlobStoreBlob(dataStore, value);
     }
 
+    private boolean errorBlob(String value) {
+        return value.startsWith(ERROR_MARKER);
+    }
+
     @Override
     public void close() throws IOException {
         if (dataStore != null) {
@@ -88,4 +100,32 @@ public class FSBlobSerializer extends Bl
             }
         }
     }
+
+    private static final class ErrorBlob extends AbstractBlob {
+        private final String id;
+
+        public ErrorBlob(String id) {
+            this.id = id.substring(ERROR_MARKER.length());
+        }
+
+        @Override
+        public String getContentIdentity() {
+            return id;
+        }
+
+        @Nonnull
+        @Override
+        public InputStream getNewStream() {
+            throw createError();
+        }
+
+        @Override
+        public long length() {
+            throw createError();
+        }
+
+        private RuntimeException createError() {
+            return new RuntimeException("Blob with id ["+id+"] threw error while serializing");
+        }
+    }
 }

Modified: jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/exporter/FSBlobSerializerTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/exporter/FSBlobSerializerTest.java?rev=1804767&r1=1804766&r2=1804767&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/exporter/FSBlobSerializerTest.java (original)
+++ jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/exporter/FSBlobSerializerTest.java Fri Aug 11 10:23:45 2017
@@ -20,6 +20,9 @@
 package org.apache.jackrabbit.oak.exporter;
 
 import java.io.File;
+import java.io.InputStream;
+
+import javax.annotation.Nonnull;
 
 import joptsimple.internal.Strings;
 import org.apache.jackrabbit.oak.api.Blob;
@@ -30,7 +33,9 @@ import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
 
 import static com.google.common.base.Charsets.UTF_8;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 public class FSBlobSerializerTest {
 
@@ -51,4 +56,38 @@ public class FSBlobSerializerTest {
         assertTrue(AbstractBlob.equal(b, b2));
     }
 
+
+    @Test
+    public void errorBlob() throws Exception{
+        FSBlobSerializer serializer = new FSBlobSerializer(folder.getRoot(), 1);
+        String blobValue = serializer.serialize(new BadBlob());
+
+        try{
+            Blob b = serializer.deserialize(blobValue);
+            assertEquals("foo", b.getContentIdentity());
+            b.getNewStream();
+            fail();
+        } catch (RuntimeException ignore){
+
+        }
+    }
+
+    private static class BadBlob extends AbstractBlob {
+
+        @Override
+        public String getContentIdentity() {
+            return "foo";
+        }
+
+        @Nonnull
+        @Override
+        public InputStream getNewStream() {
+           throw new RuntimeException();
+        }
+
+        @Override
+        public long length() {
+            return 0;
+        }
+    }
 }
\ No newline at end of file