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 am...@apache.org on 2015/08/06 06:57:27 UTC

svn commit: r1694400 - in /jackrabbit/oak/branches/1.2: ./ oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/ oak-blob/src/test/java/org/apache/jackrabbit/oak/spi/blob/ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/ oak-core/src...

Author: amitj
Date: Thu Aug  6 04:57:26 2015
New Revision: 1694400

URL: http://svn.apache.org/r1694400
Log:
OAK-2973: [Blob GC] Report accurate deleted count

Merged revision 1694394 from trunk

Modified:
    jackrabbit/oak/branches/1.2/   (props changed)
    jackrabbit/oak/branches/1.2/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStore.java
    jackrabbit/oak/branches/1.2/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/FileBlobStore.java
    jackrabbit/oak/branches/1.2/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/GarbageCollectableBlobStore.java
    jackrabbit/oak/branches/1.2/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/MemoryBlobStore.java
    jackrabbit/oak/branches/1.2/oak-blob/src/test/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStoreTest.java
    jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/MarkSweepGarbageCollector.java
    jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/cloud/CloudBlobStore.java
    jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java
    jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java
    jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/BlobCache.java
    jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java

Propchange: jackrabbit/oak/branches/1.2/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Aug  6 04:57:26 2015
@@ -1,3 +1,3 @@
 /jackrabbit/oak/branches/1.0:1665962
-/jackrabbit/oak/trunk:1672350,1672468,1672537,1672603,1672642,1672644,1672834-1672835,1673351,1673410,1673414-1673415,1673436,1673644,1673662-1673664,1673669,1673695,1673713,1673738,1673787,1673791,1674046,1674065,1674075,1674107,1674228,1674780,1674880,1675054-1675055,1675319,1675332,1675354,1675357,1675382,1675555,1675566,1675593,1676198,1676237,1676407,1676458,1676539,1676670,1676693,1676703,1676725,1677579,1677581,1677609,1677611,1677774,1677788,1677797,1677804,1677806,1677939,1677991,1678023,1678095-1678096,1678124,1678171,1678173,1678211,1678323,1678758,1678938,1678954,1679144,1679165,1679191,1679232,1679235,1679503,1679958,1679961,1680170,1680172,1680182,1680222,1680232,1680236,1680461,1680633,1680643,1680747,1680805-1680806,1680903,1681282,1681767,1681918,1682042,1682218,1682235,1682437,1682494,1682555,1682855,1682904,1683059,1683089,1683213,1683249,1683259,1683278,1683323,1683687,1683700,1684174-1684175,1684186,1684376,1684442,1684561,1684570,1684601,1684618,1684820,1684868
 ,1685023,1685075,1685370,1685552,1685589-1685590,1685840,1685964,1685977,1685989,1685999,1686023,1686032,1686097,1686162,1686229,1686234,1686253,1686414,1686780,1686854,1686857,1686971,1687053-1687055,1687175,1687196,1687198,1687220,1687239-1687240,1687301,1687441,1687553,1688089-1688090,1688172,1688179,1688349,1688421,1688436,1688453,1688616,1688622,1688634,1688636,1688817,1689003-1689004,1689008,1689577,1689581,1689623,1689810,1689828,1689831,1689833,1689903,1690017,1690043,1690047,1690057,1690247,1690249,1690634-1690637,1690650,1690669,1690674,1690885,1690941,1691139,1691151,1691159,1691167,1691183,1691188,1691210,1691280,1691307,1691331-1691333,1691345,1691384-1691385,1691401,1691509,1692133-1692134,1692156,1692250,1692274,1692363,1692382,1692478,1692955,1693002,1693030,1693209,1693421,1693525-1693526,1694007,1694393
+/jackrabbit/oak/trunk:1672350,1672468,1672537,1672603,1672642,1672644,1672834-1672835,1673351,1673410,1673414-1673415,1673436,1673644,1673662-1673664,1673669,1673695,1673713,1673738,1673787,1673791,1674046,1674065,1674075,1674107,1674228,1674780,1674880,1675054-1675055,1675319,1675332,1675354,1675357,1675382,1675555,1675566,1675593,1676198,1676237,1676407,1676458,1676539,1676670,1676693,1676703,1676725,1677579,1677581,1677609,1677611,1677774,1677788,1677797,1677804,1677806,1677939,1677991,1678023,1678095-1678096,1678124,1678171,1678173,1678211,1678323,1678758,1678938,1678954,1679144,1679165,1679191,1679232,1679235,1679503,1679958,1679961,1680170,1680172,1680182,1680222,1680232,1680236,1680461,1680633,1680643,1680747,1680805-1680806,1680903,1681282,1681767,1681918,1682042,1682218,1682235,1682437,1682494,1682555,1682855,1682904,1683059,1683089,1683213,1683249,1683259,1683278,1683323,1683687,1683700,1684174-1684175,1684186,1684376,1684442,1684561,1684570,1684601,1684618,1684820,1684868
 ,1685023,1685075,1685370,1685552,1685589-1685590,1685840,1685964,1685977,1685989,1685999,1686023,1686032,1686097,1686162,1686229,1686234,1686253,1686414,1686780,1686854,1686857,1686971,1687053-1687055,1687175,1687196,1687198,1687220,1687239-1687240,1687301,1687441,1687553,1688089-1688090,1688172,1688179,1688349,1688421,1688436,1688453,1688616,1688622,1688634,1688636,1688817,1689003-1689004,1689008,1689577,1689581,1689623,1689810,1689828,1689831,1689833,1689903,1690017,1690043,1690047,1690057,1690247,1690249,1690634-1690637,1690650,1690669,1690674,1690885,1690941,1691139,1691151,1691159,1691167,1691183,1691188,1691210,1691280,1691307,1691331-1691333,1691345,1691384-1691385,1691401,1691509,1692133-1692134,1692156,1692250,1692274,1692363,1692382,1692478,1692955,1693002,1693030,1693209,1693421,1693525-1693526,1694007,1694393-1694394
 /jackrabbit/trunk:1345480

Modified: jackrabbit/oak/branches/1.2/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStore.java?rev=1694400&r1=1694399&r2=1694400&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStore.java (original)
+++ jackrabbit/oak/branches/1.2/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStore.java Thu Aug  6 04:57:26 2015
@@ -33,6 +33,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.WeakHashMap;
@@ -574,6 +575,11 @@ public abstract class AbstractBlobStore
     public Iterator<String> resolveChunks(String blobId) throws IOException {
         return new ChunkIterator(blobId);
     }
+
+    @Override
+    public boolean deleteChunks(List<String> chunkIds, long maxLastModifiedTime) throws Exception {
+        return (chunkIds.size() == countDeleteChunks(chunkIds, maxLastModifiedTime));
+    }
     
     /**
      * A block id. Blocks are small enough to fit in memory, so they can be

Modified: jackrabbit/oak/branches/1.2/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/FileBlobStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/FileBlobStore.java?rev=1694400&r1=1694399&r2=1694400&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/FileBlobStore.java (original)
+++ jackrabbit/oak/branches/1.2/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/FileBlobStore.java Thu Aug  6 04:57:26 2015
@@ -220,7 +220,8 @@ public class FileBlobStore extends Abstr
     }
 
     @Override
-    public boolean deleteChunks(List<String> chunkIds, long maxLastModifiedTime) throws Exception {
+    public long countDeleteChunks(List<String> chunkIds, long maxLastModifiedTime) throws Exception {
+        int count = 0;
         for (String chunkId : chunkIds) {
             byte[] digest = StringUtils.convertHexToBytes(chunkId);
             File f = getFile(digest, false);
@@ -233,9 +234,10 @@ public class FileBlobStore extends Abstr
             if ((maxLastModifiedTime <= 0) 
                     || FileUtils.isFileOlder(f, maxLastModifiedTime)) {
                 f.delete();
+                count++;
             }
         }
-        return true;
+        return count;
     }
 
     @Override
@@ -270,4 +272,4 @@ public class FileBlobStore extends Abstr
     public void clearCache() {
         // no cache
     }
-}
\ No newline at end of file
+}

Modified: jackrabbit/oak/branches/1.2/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/GarbageCollectableBlobStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/GarbageCollectableBlobStore.java?rev=1694400&r1=1694399&r2=1694400&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/GarbageCollectableBlobStore.java (original)
+++ jackrabbit/oak/branches/1.2/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/GarbageCollectableBlobStore.java Thu Aug  6 04:57:26 2015
@@ -16,6 +16,8 @@
  */
 package org.apache.jackrabbit.oak.spi.blob;
 
+import aQute.bnd.annotation.ProviderType;
+
 import java.io.IOException;
 import java.util.Iterator;
 import java.util.List;
@@ -23,6 +25,7 @@ import java.util.List;
 /**
  * A blob store that supports garbage collection.
  */
+@ProviderType
 public interface GarbageCollectableBlobStore extends BlobStore {
 
     /**
@@ -91,9 +94,20 @@ public interface GarbageCollectableBlobS
      * @return true, if successful
      * @throws Exception the exception
      */
+    @Deprecated
     boolean deleteChunks(List<String> chunkIds, long maxLastModifiedTime) throws Exception;
 
     /**
+     * Deletes the blobs with the given ids.
+     *
+     * @param chunkIds the chunk ids
+     * @param maxLastModifiedTime the max last modified time to consider for retrieval
+     * @return long the count of successful deletions
+     * @throws Exception the exception
+     */
+    long countDeleteChunks(List<String> chunkIds, long maxLastModifiedTime) throws Exception;
+
+    /**
      * Resolve chunks from the given Id.
      * 
      * @param blobId the blob id

Modified: jackrabbit/oak/branches/1.2/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/MemoryBlobStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/MemoryBlobStore.java?rev=1694400&r1=1694399&r2=1694400&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/MemoryBlobStore.java (original)
+++ jackrabbit/oak/branches/1.2/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/MemoryBlobStore.java Thu Aug  6 04:57:26 2015
@@ -85,16 +85,19 @@ public class MemoryBlobStore extends Abs
      * Ignores the maxlastModifiedTime
      */
     @Override
-    public boolean deleteChunks(List<String> chunkIds, long maxLastModifiedTime) throws Exception {
+    public long countDeleteChunks(List<String> chunkIds, long maxLastModifiedTime) throws Exception {
+        int count = 0;
         for (String chunkId : chunkIds) {
             BlockId id = new BlockId(StringUtils.convertHexToBytes(chunkId), 0);
             if (map.containsKey(id)) {
                 map.remove(id);
+                count++;
             } else if (old.containsKey(id)) {
                 old.remove(id);
+                count++;
             }
         }
-        return true;
+        return count;
     }
 
     /**

Modified: jackrabbit/oak/branches/1.2/oak-blob/src/test/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-blob/src/test/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStoreTest.java?rev=1694400&r1=1694399&r2=1694400&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-blob/src/test/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStoreTest.java (original)
+++ jackrabbit/oak/branches/1.2/oak-blob/src/test/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStoreTest.java Thu Aug  6 04:57:26 2015
@@ -422,6 +422,22 @@ public abstract class AbstractBlobStoreT
 
         assertTrue(ret.toString(), ret.isEmpty());
     }
+    
+    @Test
+    public void deleteCount() throws Exception {
+        Set<String> ids = createArtifacts();
+
+        long count = store.countDeleteChunks(Lists.newArrayList(ids), 0);
+
+        Iterator<String> iter = store.getAllChunkIds(0);
+        Set<String> ret = Sets.newHashSet();
+        while (iter.hasNext()) {
+            ret.add(iter.next());
+        }
+
+        assertTrue(ret.toString(), ret.isEmpty());
+        assertEquals(ids.size(), count);
+    }
 
     private Set<String> createArtifacts() throws Exception {
         Set<String> ids = Sets.newHashSet();

Modified: jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/MarkSweepGarbageCollector.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/MarkSweepGarbageCollector.java?rev=1694400&r1=1694399&r2=1694400&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/MarkSweepGarbageCollector.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/MarkSweepGarbageCollector.java Thu Aug  6 04:57:26 2015
@@ -180,13 +180,11 @@ public class MarkSweepGarbageCollector i
 
             mark();
             if (!markOnly) {
-                int deleteCount = sweep();
+                long deleteCount = sweep();
                 threw = false;
 
-                LOG.info(
-                    "Blob garbage collection completed in {}. Number of blobs identified for deletion [{}] (This "
-                        + "includes blobs newer than configured interval [{}] which are ignored for deletion)",
-                    sw.toString(), deleteCount, maxLastModifiedInterval);
+                LOG.info("Blob garbage collection completed in {}. Number of blobs deleted [{}]", sw.toString(),
+                    deleteCount, maxLastModifiedInterval);
             }
         } finally {
             if (!LOG.isTraceEnabled()) {
@@ -282,7 +280,7 @@ public class MarkSweepGarbageCollector i
      * @return the number of blobs deleted
      * @throws Exception the exception
      */
-    private int sweep() throws Exception {
+    private long sweep() throws Exception {
         long earliestRefAvailTime;
         // Merge all the blob references available from all the reference files in the data store meta store
         // Only go ahead if merge succeeded
@@ -299,7 +297,9 @@ public class MarkSweepGarbageCollector i
 
         // Calculate the references not used
         difference();
-        int count = 0;
+        long count = 0;
+        long deleted = 0;
+
         state = State.SWEEPING;
         LOG.debug("Starting sweep phase of the garbage collector");
         LOG.debug("Sweeping blobs with modified time > than the configured max deleted time ({}). " +
@@ -314,18 +314,17 @@ public class MarkSweepGarbageCollector i
         while (iterator.hasNext()) {
             ids.add(iterator.next());
 
-            if (ids.size() > getBatchCount()) {
+            if (ids.size() >= getBatchCount()) {
                 count += ids.size();
-                sweepInternal(ids, exceptionQueue, earliestRefAvailTime);
+                deleted += sweepInternal(ids, exceptionQueue, earliestRefAvailTime);
                 ids = Lists.newArrayList();
             }
         }
         if (!ids.isEmpty()) {
             count += ids.size();
-            sweepInternal(ids, exceptionQueue, earliestRefAvailTime);
+            deleted += sweepInternal(ids, exceptionQueue, earliestRefAvailTime);
         }
 
-        count -= exceptionQueue.size();
         BufferedWriter writer = null;
         try {
             if (!exceptionQueue.isEmpty()) {
@@ -336,16 +335,23 @@ public class MarkSweepGarbageCollector i
             LineIterator.closeQuietly(iterator);
             IOUtils.closeQuietly(writer);
         }
+
         if(!exceptionQueue.isEmpty()) {
-            LOG.warn(
-                "Unable to delete some blobs entries from the blob store. This may happen if blob modified time is > "
-                    + "than the max deleted time ({}). Details around such blob entries can be found in [{}]",
-                timestampToString(getLastMaxModifiedTime(earliestRefAvailTime)), fs.getGarbage().getAbsolutePath());
+            LOG.warn("Unable to delete some blobs entries from the blob store. Details around such blob entries can " 
+                         + "be found in [{}]",
+                        fs.getGarbage().getAbsolutePath());
+        }
+        if(count != deleted) {
+            LOG.warn("Deleted only [{}] blobs entries from the [{}] candidates identified. This may happen if blob " 
+                         + "modified time is > "
+                         + "than the max deleted time ({})", deleted, count,
+                        timestampToString(getLastMaxModifiedTime(earliestRefAvailTime)));
         }
+
         // Remove all the merged marked references
         GarbageCollectionType.get(blobStore).removeAllMarkedReferences(blobStore);
         LOG.debug("Ending sweep phase of the garbage collector");
-        return count;
+        return deleted;
     }
 
     private int getBatchCount() {
@@ -375,19 +381,21 @@ public class MarkSweepGarbageCollector i
      * @param exceptionQueue
      * @param maxModified
      */
-    private void sweepInternal(List<String> ids, ConcurrentLinkedQueue<String> exceptionQueue, long maxModified) {
+    private long sweepInternal(List<String> ids, ConcurrentLinkedQueue<String> exceptionQueue, long maxModified) {
+        long deleted = 0;
         try {
-            LOG.debug("Blob ids to be deleted {}", ids);
-            boolean deleted = blobStore.deleteChunks(ids, getLastMaxModifiedTime(maxModified));
-            if (!deleted) {
+            LOG.trace("Blob ids to be deleted {}", ids);
+            deleted = blobStore.countDeleteChunks(ids, getLastMaxModifiedTime(maxModified));
+            if (deleted != ids.size()) {
                 // Only log and do not add to exception queue since some blobs may not match the
                 // lastMaxModifiedTime criteria.
-                LOG.debug("Some blobs were not deleted from the batch : [{}]", ids);
+                LOG.debug("Some [{}] blobs were not deleted from the batch : [{}]", ids.size() - deleted, ids);
             }
         } catch (Exception e) {
             LOG.warn("Error occurred while deleting blob with ids [{}]", ids, e);
             exceptionQueue.addAll(ids);
         }
+        return deleted;
     }
 
     /**

Modified: jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/cloud/CloudBlobStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/cloud/CloudBlobStore.java?rev=1694400&r1=1694399&r2=1694400&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/cloud/CloudBlobStore.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/cloud/CloudBlobStore.java Thu Aug  6 04:57:26 2015
@@ -221,19 +221,19 @@ public class CloudBlobStore extends Cach
     }
 
     @Override
-    public boolean deleteChunks(List<String> chunkIds, long maxLastModifiedTime) throws Exception {
+    public long countDeleteChunks(List<String> chunkIds, long maxLastModifiedTime) throws Exception {
         Preconditions.checkNotNull(context);
-
+        long count = 0;
         for (String chunkId : chunkIds) {
             final org.jclouds.blobstore.BlobStore blobStore = context.getBlobStore();
             StorageMetadata metadata = blobStore.blobMetadata(cloudContainer, chunkId);
             if ((maxLastModifiedTime <= 0) 
                     || (metadata.getLastModified().getTime() <= maxLastModifiedTime)) {
                 blobStore.removeBlob(cloudContainer, chunkId);
-                return true;
+                count++;
             }
         }
-        return true;
+        return count;
     }
 
     class CloudStoreIterator implements Iterator<String> {

Modified: jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java?rev=1694400&r1=1694399&r2=1694400&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java Thu Aug  6 04:57:26 2015
@@ -378,6 +378,12 @@ public class DataStoreBlobStore implemen
 
     @Override
     public boolean deleteChunks(List<String> chunkIds, long maxLastModifiedTime) throws Exception {
+        return (chunkIds.size() == countDeleteChunks(chunkIds, maxLastModifiedTime));
+    }    
+    
+    @Override
+    public long countDeleteChunks(List<String> chunkIds, long maxLastModifiedTime) throws Exception {
+        int count = 0;
         if (delegate instanceof MultiDataStoreAware) {
             for (String chunkId : chunkIds) {
                 String blobId = extractBlobId(chunkId);
@@ -385,15 +391,16 @@ public class DataStoreBlobStore implemen
                 DataRecord dataRecord = delegate.getRecord(identifier);
                 boolean success = (maxLastModifiedTime <= 0)
                         || dataRecord.getLastModified() <= maxLastModifiedTime;
-                log.debug("Deleting blob [{}] with last modified date [{}] : [{}]", blobId,
+                log.trace("Deleting blob [{}] with last modified date [{}] : [{}]", blobId,
                     dataRecord.getLastModified(), success);
                 if (success) {
                     ((MultiDataStoreAware) delegate).deleteRecord(identifier);
-                    log.debug("Deleted blob [{}]", blobId);
+                    log.trace("Deleted blob [{}]", blobId);
+                    count++;
                 }
             }
         }
-        return true;
+        return count;
     }
 
     @Override

Modified: jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java?rev=1694400&r1=1694399&r2=1694400&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java Thu Aug  6 04:57:26 2015
@@ -205,7 +205,7 @@ public class MongoBlobStore extends Cach
     }
 
     @Override
-    public boolean deleteChunks(List<String> chunkIds, long maxLastModifiedTime) throws Exception {
+    public long countDeleteChunks(List<String> chunkIds, long maxLastModifiedTime) throws Exception {
         DBCollection collection = getBlobCollection();
         QueryBuilder queryBuilder = new QueryBuilder();
         if (chunkIds != null) {
@@ -217,11 +217,7 @@ public class MongoBlobStore extends Cach
         }
 
         WriteResult result = collection.remove(queryBuilder.get());
-        if (result.getN() == chunkIds.size()) {
-            return true;
-        }
-
-        return false;
+        return result.getN();
     }
 
     @Override

Modified: jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/BlobCache.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/BlobCache.java?rev=1694400&r1=1694399&r2=1694400&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/BlobCache.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/BlobCache.java Thu Aug  6 04:57:26 2015
@@ -161,6 +161,11 @@ public class BlobCache implements BlobSt
     }
 
     @Override
+    public long countDeleteChunks(List<String> arg0, long arg1) throws Exception {
+        return base.countDeleteChunks(arg0, arg1);
+    }
+    
+    @Override
     public Iterator<String> getAllChunkIds(long arg0) throws Exception {
         return base.getAllChunkIds(arg0);
     }

Modified: jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java?rev=1694400&r1=1694399&r2=1694400&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java Thu Aug  6 04:57:26 2015
@@ -605,12 +605,12 @@ public class RDBBlobStore extends Cachin
     }
 
     @Override
-    public boolean deleteChunks(List<String> chunkIds, long maxLastModifiedTime) throws Exception {
-
+    public long countDeleteChunks(List<String> chunkIds, long maxLastModifiedTime) throws Exception {
+        long count = 0;
         // sanity check
         if (chunkIds.isEmpty()) {
             // sanity check, nothing to do
-            return true;
+            return count;
         }
 
         Connection con = this.ch.getRWConnection();
@@ -645,7 +645,7 @@ public class RDBBlobStore extends Cachin
                 prepData.setString(idx + 1, chunkIds.get(idx));
             }
 
-            prepMeta.execute();
+            count = prepMeta.executeUpdate();
             prepData.execute();
             prepMeta.close();
             prepMeta = null;
@@ -658,7 +658,7 @@ public class RDBBlobStore extends Cachin
             this.ch.closeConnection(con);
         }
 
-        return true;
+        return count;
     }
 
     @Override