Author: catholicon
Date: Mon Jul 31 13:19:30 2017
New Revision: 1803532

URL: http://svn.apache.org/viewvc?rev=1803532&view=rev
Log:
OAK-6503: Active deletion of blobs tries to delete sub-16k inlined blobs in 
case of seg-tar

Only blobs that expose content identity should be deleted from blob
store .... others are either inlined by blob store (less that configured
side for going into blob store... default 4k) or by seg-tar (less that 
threshold where
seg-tar would inline binaries... default 16k).

OakDirectory, hence, should only report blobs as deleted which expose
contentIdentity

Modified:
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/OakDirectory.java
    
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/OakDirectoryTest.java

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/OakDirectory.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/OakDirectory.java?rev=1803532&r1=1803531&r2=1803532&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/OakDirectory.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/OakDirectory.java
 Mon Jul 31 13:19:30 2017
@@ -166,11 +166,10 @@ public class OakDirectory extends Direct
                     //Mark the blob as deleted. Also, post index path, type of 
directory
                     //(:suggest, :data, etc) and filename being deleted
                     String blobId = b.getContentIdentity();
-                    if (blobId == null) {
-                        blobId = b.toString();
+                    if (blobId != null) {
+                        blobDeletionCallback.deleted(blobId,
+                                Lists.newArrayList(definition.getIndexPath(), 
dataNodeName, name));
                     }
-                    blobDeletionCallback.deleted(blobId,
-                            Lists.newArrayList(definition.getIndexPath(), 
dataNodeName, name));
                 }
             }
         }

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/OakDirectoryTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/OakDirectoryTest.java?rev=1803532&r1=1803531&r2=1803532&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/OakDirectoryTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/OakDirectoryTest.java
 Mon Jul 31 13:19:30 2017
@@ -47,12 +47,14 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.Random;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.io.input.NullInputStream;
 import org.apache.jackrabbit.oak.api.Blob;
 import org.apache.jackrabbit.oak.api.Type;
+import 
org.apache.jackrabbit.oak.plugins.index.lucene.directory.ActiveDeletedBlobCollectorFactory;
 import org.apache.jackrabbit.oak.plugins.memory.ArrayBasedBlob;
 import org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState;
 import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
@@ -461,6 +463,59 @@ public class OakDirectoryTest {
         dir.close();
     }
 
+    // OAK-6503
+    @Test
+    public void dontMarkNonBlobStoreBlobsAsDeleted() throws Exception{
+        final String deletedBlobId = "blobIdentifier";
+        final String blobIdToString = 
"NeverEver-Ever-Ever-ShouldThisBeMarkedAsDeleted";
+        final int fileSize = 1;
+
+        final AtomicBoolean identifiableBlob = new AtomicBoolean(false);
+
+        IndexDefinition def = new IndexDefinition(root, 
builder.getNodeState(), "/foo");
+        OakDirectory.BlobFactory factory = new OakDirectory.BlobFactory() {
+            @Override
+            public Blob createBlob(InputStream in) throws IOException {
+                ByteArrayOutputStream out = new ByteArrayOutputStream();
+                IOUtils.copy(in, out);
+                byte[] data = out.toByteArray();
+                return new ArrayBasedBlob(data) {
+                    @Override
+                    public String getContentIdentity() {
+                        return identifiableBlob.get()?deletedBlobId:null;
+                    }
+
+                    @Override
+                    public String toString() {
+                        return blobIdToString;
+                    }
+                };
+            }
+        };
+
+        OakDirectory dir = new OakDirectory(builder, INDEX_DATA_CHILD_NAME, 
def, false, factory,
+                new ActiveDeletedBlobCollectorFactory.BlobDeletionCallback() {
+                    @Override
+                    public void deleted(String blobId, Iterable<String> ids) {
+                        assertEquals("Only blobs with content identity must be 
reported as deleted", deletedBlobId, blobId);
+                    }
+
+                    @Override
+                    public void commitProgress(IndexProgress indexProgress) {
+                    }
+                });
+
+        writeFile(dir, "file1", fileSize);
+        writeFile(dir, "file2", fileSize);
+
+        dir.deleteFile("file1");
+
+        identifiableBlob.set(true);
+        dir.deleteFile("file2");
+
+        dir.close();
+    }
+
     @Test
     public void blobFactory() throws Exception {
         final AtomicInteger numBlobs = new AtomicInteger();


Reply via email to