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