Author: amitj
Date: Wed Jul 20 03:57:11 2016
New Revision: 1753433

URL: http://svn.apache.org/viewvc?rev=1753433&view=rev
Log:
OAK-4200:  [BlobGC] Improve collection times of blobs available

* Ignoring and logging exception for tracker add
* Ignoring inlined blobs

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStoreTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreTrackerGCTest.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java?rev=1753433&r1=1753432&r2=1753433&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java
 Wed Jul 20 03:57:11 2016
@@ -211,8 +211,13 @@ public class DataStoreBlobStore implemen
             checkNotNull(stream);
             DataRecord dr = writeStream(stream);
             String id = getBlobId(dr);
-            if (tracker != null) {
-                tracker.add(id);
+            if (tracker != null && !InMemoryDataRecord.isInstance(id)) {
+                try {
+                    tracker.add(id);
+                    log.trace("Tracked Id {}", id);
+                } catch (Exception e) {
+                    log.warn("Could not add track id", e);
+                }
             }
             threw = false;
             stats.uploaded(System.nanoTime() - start, TimeUnit.NANOSECONDS, 
dr.getLength());

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStoreTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStoreTest.java?rev=1753433&r1=1753432&r2=1753433&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStoreTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStoreTest.java
 Wed Jul 20 03:57:11 2016
@@ -43,7 +43,6 @@ import org.apache.jackrabbit.core.data.D
 import org.apache.jackrabbit.core.data.DataStoreException;
 import org.apache.jackrabbit.oak.spi.blob.AbstractBlobStoreTest;
 import org.apache.jackrabbit.oak.spi.blob.BlobStoreInputStream;
-import org.apache.jackrabbit.oak.spi.blob.GarbageCollectableBlobStore;
 import org.apache.jackrabbit.oak.spi.blob.stats.BlobStatsCollector;
 import org.junit.After;
 import org.junit.Before;
@@ -55,6 +54,7 @@ import static org.junit.Assert.assertFal
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -202,6 +202,24 @@ public class DataStoreBlobStoreTest exte
         assertFalse(BlobId.isEncoded("abc"));
     }
 
+    @Test
+    public void testAddOnTrackError() throws Exception {
+        int maxInlineSize = 300;
+        byte[] data = new byte[maxInlineSize];
+        new Random().nextBytes(data);
+
+        DataStore mockedDS = mock(DataStore.class);
+        when(mockedDS.getMinRecordLength()).thenReturn(maxInlineSize);
+        DataStoreBlobStore ds = new DataStoreBlobStore(mockedDS);
+
+        BlobIdTracker mockedTracker = mock(BlobIdTracker.class);
+        doThrow(new IOException("Mocking tracking 
error")).when(mockedTracker).add(any(String.class));
+        ds.addTracker(mockedTracker);
+
+        String id = ds.writeBlob(new ByteArrayInputStream(data));
+        assertTrue(IOUtils.contentEquals(new ByteArrayInputStream(data), 
ds.getInputStream(id)));
+    }
+
     @Override
     @Test
     public void testCombinedIdentifier() throws Exception {

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreTrackerGCTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreTrackerGCTest.java?rev=1753433&r1=1753432&r2=1753433&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreTrackerGCTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreTrackerGCTest.java
 Wed Jul 20 03:57:11 2016
@@ -21,6 +21,7 @@ import java.io.Closeable;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Random;
@@ -40,7 +41,10 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.plugins.identifier.ClusterRepositoryInfo;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.apache.jackrabbit.oak.spi.blob.GarbageCollectableBlobStore;
+import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
+import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeStore;
 import org.apache.jackrabbit.oak.stats.Clock;
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -141,6 +145,39 @@ public class DataStoreTrackerGCTest {
     }
 
     @Test
+    public void gcWithInlined() throws Exception {
+        Cluster cluster = new Cluster("cluster1");
+        BlobStore s = cluster.blobStore;
+        BlobIdTracker tracker = (BlobIdTracker) ((BlobTrackingStore) 
s).getTracker();
+        DataStoreState state = init(cluster.nodeStore, 0);
+        addInlined(cluster.nodeStore);
+        ScheduledFuture<?> scheduledFuture = newSingleThreadScheduledExecutor()
+            .schedule(tracker.new SnapshotJob(), 0, MILLISECONDS);
+        scheduledFuture.get();
+        // All blobs added should be tracked now
+        assertEquals(state.blobsAdded, retrieveTracked(tracker));
+
+        cluster.gc.collectGarbage(false);
+        Set<String> existingAfterGC = iterate(s);
+        // Check the state of the blob store after gc
+        assertEquals(state.blobsPresent, existingAfterGC);
+        // Tracked blobs should reflect deletions after gc
+        assertEquals(state.blobsPresent, retrieveTracked(tracker));
+    }
+
+    private HashSet<String> addInlined(NodeStore nodeStore) throws Exception {
+        HashSet<String> set = new HashSet<String>();
+        NodeBuilder a = nodeStore.getRoot().builder();
+        int number = 4;
+        for (int i = 0; i < number; i++) {
+            Blob b = nodeStore.createBlob(randomStream(i, 90));
+            a.child("cinline" + i).setProperty("x", b);
+        }
+        nodeStore.merge(a, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+        return set;
+    }
+
+    @Test
     public void differentCluster() throws Exception {
         // Add blobs to cluster1
         Cluster cluster1 = new Cluster("cluster1");


Reply via email to