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 2014/05/20 15:41:04 UTC

svn commit: r1596241 - /jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/ExternalBlobTest.java

Author: chetanm
Date: Tue May 20 13:41:04 2014
New Revision: 1596241

URL: http://svn.apache.org/r1596241
Log:
OAK-1817 - NPE in MarkSweepGarbageCollector.saveBatchToFile during Datastore GC with FileDataStore

Adding testcase to try to reproduce the issue

Modified:
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/ExternalBlobTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/ExternalBlobTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/ExternalBlobTest.java?rev=1596241&r1=1596240&r2=1596241&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/ExternalBlobTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/ExternalBlobTest.java Tue May 20 13:41:04 2014
@@ -16,11 +16,12 @@
  */
 package org.apache.jackrabbit.oak.plugins.segment;
 
+import com.google.common.collect.Lists;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
-import org.apache.jackrabbit.core.data.DataIdentifier;
 import org.apache.jackrabbit.core.data.FileDataStore;
 import org.apache.jackrabbit.oak.api.Blob;
+import org.apache.jackrabbit.oak.plugins.blob.ReferenceCollector;
 import org.apache.jackrabbit.oak.plugins.blob.datastore.DataStoreBlobStore;
 import org.apache.jackrabbit.oak.plugins.memory.AbstractBlob;
 import org.apache.jackrabbit.oak.plugins.segment.file.FileBlob;
@@ -39,6 +40,7 @@ import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.List;
 import java.util.Random;
 
 import static junit.framework.Assert.assertTrue;
@@ -59,16 +61,12 @@ public class ExternalBlobTest {
 
     @Test
     public void testDataStoreBlob() throws Exception {
-        FileDataStore fds = new FileDataStore();
-        fds.setMinRecordLength(4092);
-        fds.init(getWorkDir().getAbsolutePath());
+        FileDataStore fds = createFileDataStore();
         DataStoreBlobStore dbs = new DataStoreBlobStore(fds);
         nodeStore = getNodeStore(dbs);
 
         //Test for Blob which get inlined
-        byte[] data = new byte[fds.getMinRecordLength()-2];
-        new Random().nextBytes(data);
-        Blob b1 = testCreateAndRead(nodeStore.createBlob(new ByteArrayInputStream(data)));
+        Blob b1 = testCreateAndRead(createBlob(fds.getMinRecordLength()-2));
         assertTrue(b1 instanceof SegmentBlob);
         assertNull(((SegmentBlob) b1).getBlobId());
 
@@ -83,7 +81,30 @@ public class ExternalBlobTest {
         is.close();
     }
 
-    public Blob testCreateAndRead(Blob blob) throws Exception {
+    @Test
+    public void testNullBlobId() throws Exception{
+        FileDataStore fds = createFileDataStore();
+        DataStoreBlobStore dbs = new DataStoreBlobStore(fds);
+        nodeStore = getNodeStore(dbs);
+
+        NodeBuilder nb = nodeStore.getRoot().builder();
+        NodeBuilder cb = nb.child("hello");
+        cb.setProperty("blob1", createBlob(Segment.MEDIUM_LIMIT - 1));
+        cb.setProperty("blob2", createBlob(Segment.MEDIUM_LIMIT + 1));
+        cb.setProperty("blob3", createBlob(Segment.MEDIUM_LIMIT + 1));
+        nodeStore.merge(nb, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+
+        final List<String> refrences = Lists.newArrayList();
+        store.getTracker().collectBlobReferences(new ReferenceCollector() {
+            @Override
+            public void addReference(String reference) {
+                assertNotNull(reference);
+                refrences.add(reference);
+            }
+        });
+    }
+
+    private Blob testCreateAndRead(Blob blob) throws Exception {
         NodeState state = nodeStore.getRoot().getChildNode("hello");
         if (!state.exists()) {
             NodeBuilder builder = nodeStore.getRoot().builder();
@@ -119,6 +140,19 @@ public class ExternalBlobTest {
         return nodeStore;
     }
 
+    private Blob createBlob(int size) throws IOException {
+        byte[] data = new byte[size];
+        new Random().nextBytes(data);
+        return nodeStore.createBlob(new ByteArrayInputStream(data));
+    }
+
+    private FileDataStore createFileDataStore() {
+        FileDataStore fds = new FileDataStore();
+        fds.setMinRecordLength(4092);
+        fds.init(getWorkDir().getAbsolutePath());
+        return fds;
+    }
+
     private File getWorkDir(){
         return new File("target", "ExternalBlobTest");
     }