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 05:36:52 UTC

svn commit: r1694394 - in /jackrabbit/oak/trunk: 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/main/java...

Author: amitj
Date: Thu Aug  6 03:36:52 2015
New Revision: 1694394

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

* Added another method GarbageCollectableBlobStore#countDeleteChunks to return the actual count deleted
* Changed implementations of GarbageCollectableBlobStore
* Deprecated and delegated older deleteChunks to use the new countDeleteChunks method.

Modified:
    jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStore.java
    jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/FileBlobStore.java
    jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/GarbageCollectableBlobStore.java
    jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/MemoryBlobStore.java
    jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/package-info.java
    jackrabbit/oak/trunk/oak-blob/src/test/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStoreTest.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/MarkSweepGarbageCollector.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/cloud/CloudBlobStore.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/BlobCache.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java

Modified: jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStore.java?rev=1694394&r1=1694393&r2=1694394&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStore.java (original)
+++ jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStore.java Thu Aug  6 03:36:52 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/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/FileBlobStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/FileBlobStore.java?rev=1694394&r1=1694393&r2=1694394&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/FileBlobStore.java (original)
+++ jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/FileBlobStore.java Thu Aug  6 03:36:52 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/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/GarbageCollectableBlobStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/GarbageCollectableBlobStore.java?rev=1694394&r1=1694393&r2=1694394&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/GarbageCollectableBlobStore.java (original)
+++ jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/GarbageCollectableBlobStore.java Thu Aug  6 03:36:52 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/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/MemoryBlobStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/MemoryBlobStore.java?rev=1694394&r1=1694393&r2=1694394&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/MemoryBlobStore.java (original)
+++ jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/MemoryBlobStore.java Thu Aug  6 03:36:52 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/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/package-info.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/package-info.java?rev=1694394&r1=1694393&r2=1694394&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/package-info.java (original)
+++ jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/package-info.java Thu Aug  6 03:36:52 2015
@@ -14,9 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-@Version("1.0")
+@Version("1.1")
 @Export(optional = "provide:=true")
 package org.apache.jackrabbit.oak.spi.blob;
 
 import aQute.bnd.annotation.Version;
-import aQute.bnd.annotation.Export;
\ No newline at end of file
+import aQute.bnd.annotation.Export;

Modified: jackrabbit/oak/trunk/oak-blob/src/test/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob/src/test/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStoreTest.java?rev=1694394&r1=1694393&r2=1694394&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-blob/src/test/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStoreTest.java (original)
+++ jackrabbit/oak/trunk/oak-blob/src/test/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStoreTest.java Thu Aug  6 03:36:52 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/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/MarkSweepGarbageCollector.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/MarkSweepGarbageCollector.java?rev=1694394&r1=1694393&r2=1694394&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/MarkSweepGarbageCollector.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/MarkSweepGarbageCollector.java Thu Aug  6 03:36:52 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/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/cloud/CloudBlobStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/cloud/CloudBlobStore.java?rev=1694394&r1=1694393&r2=1694394&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/cloud/CloudBlobStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/cloud/CloudBlobStore.java Thu Aug  6 03:36:52 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/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=1694394&r1=1694393&r2=1694394&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 Thu Aug  6 03:36:52 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/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java?rev=1694394&r1=1694393&r2=1694394&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java Thu Aug  6 03:36:52 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/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/BlobCache.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/BlobCache.java?rev=1694394&r1=1694393&r2=1694394&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/BlobCache.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/BlobCache.java Thu Aug  6 03:36:52 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/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java?rev=1694394&r1=1694393&r2=1694394&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java Thu Aug  6 03:36:52 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