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