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");
}