Author: chetanm
Date: Thu Mar 27 15:18:49 2014
New Revision: 1582346
URL: http://svn.apache.org/r1582346
Log:
OAK-1341 - DocumentNodeStore: Implement revision garbage collection (WIP)
Add method for batch removal to DocumentStore
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStore.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LoggingDocumentStoreWrapper.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/SynchronizingDocumentStoreWrapper.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/TimingDocumentStoreWrapper.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/MongoDocumentStoreTest.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStore.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStore.java?rev=1582346&r1=1582345&r2=1582346&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStore.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStore.java
Thu Mar 27 15:18:49 2014
@@ -114,6 +114,15 @@ public interface DocumentStore {
<T extends Document> void remove(Collection<T> collection, String key);
/**
+ * Batch remove documents with given key.
+ *
+ * @param <T> the document type
+ * @param collection the collection
+ * @param keys list of keys
+ */
+ <T extends Document> void remove(Collection<T> collection, List<String>
keys);
+
+ /**
* Try to create a list of documents.
*
* @param <T> the document type
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java?rev=1582346&r1=1582345&r2=1582346&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java
Thu Mar 27 15:18:49 2014
@@ -150,6 +150,13 @@ public class MemoryDocumentStore impleme
}
}
+ @Override
+ public <T extends Document> void remove(Collection<T> collection,
List<String> keys) {
+ for(String key : keys){
+ remove(collection, key);
+ }
+ }
+
@CheckForNull
@Override
public <T extends Document> T createOrUpdate(Collection<T> collection,
UpdateOp update)
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java?rev=1582346&r1=1582345&r2=1582346&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
Thu Mar 27 15:18:49 2014
@@ -36,6 +36,7 @@ import javax.annotation.Nullable;
import com.google.common.base.Splitter;
+import com.google.common.collect.Lists;
import org.apache.jackrabbit.mk.api.MicroKernelException;
import org.apache.jackrabbit.oak.cache.CacheStats;
import org.apache.jackrabbit.oak.cache.CacheValue;
@@ -86,6 +87,8 @@ public class MongoDocumentStore implemen
private static final DBObject BY_ID_ASC = new BasicDBObject(Document.ID,
1);
+ public static final int IN_CLAUSE_BATCH_SIZE = 500;
+
private final DBCollection nodes;
private final DBCollection clusterNodes;
private final DBCollection settings;
@@ -204,6 +207,13 @@ public class MongoDocumentStore implemen
}
}
+ public <T extends Document> void invalidateCache(Collection<T> collection,
List<String> keys) {
+ for(String key : keys){
+ invalidateCache(collection, key);
+ }
+ }
+
+
@Override
public <T extends Document> T find(Collection<T> collection, String key) {
return find(collection, key, Integer.MAX_VALUE);
@@ -380,6 +390,20 @@ public class MongoDocumentStore implemen
}
}
+ @Override
+ public <T extends Document> void remove(Collection<T> collection,
List<String> keys) {
+ DBCollection dbCollection = getDBCollection(collection);
+ for(List<String> keyBatch : Lists.partition(keys,
IN_CLAUSE_BATCH_SIZE)){
+ DBObject query =
QueryBuilder.start(Document.ID).in(keyBatch).get();
+ WriteResult writeResult = dbCollection.remove(query,
WriteConcern.SAFE);
+ invalidateCache(collection, keyBatch);
+ if (writeResult.getError() != null) {
+ throw new MicroKernelException("Remove failed: " +
writeResult.getError());
+ }
+ }
+
+ }
+
@CheckForNull
private <T extends Document> T findAndModify(Collection<T> collection,
UpdateOp updateOp,
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java?rev=1582346&r1=1582345&r2=1582346&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
Thu Mar 27 15:18:49 2014
@@ -167,6 +167,14 @@ public class RDBDocumentStore implements
}
@Override
+ public <T extends Document> void remove(Collection<T> collection,
List<String> keys) {
+ //TODO Use batch delete
+ for(String key : keys){
+ remove(collection, key);
+ }
+ }
+
+ @Override
public <T extends Document> boolean create(Collection<T> collection,
List<UpdateOp> updateOps) {
return internalCreate(collection, updateOps);
}
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LoggingDocumentStoreWrapper.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LoggingDocumentStoreWrapper.java?rev=1582346&r1=1582345&r2=1582346&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LoggingDocumentStoreWrapper.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LoggingDocumentStoreWrapper.java
Thu Mar 27 15:18:49 2014
@@ -140,6 +140,14 @@ public class LoggingDocumentStoreWrapper
}
@Override
+ public <T extends Document> void remove(Collection<T> collection,
List<String> keys) {
+ //TODO Logging
+ for(String key : keys){
+ remove(collection, key);
+ }
+ }
+
+ @Override
public <T extends Document> boolean create(final Collection<T> collection,
final List<UpdateOp> updateOps)
{
try {
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/SynchronizingDocumentStoreWrapper.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/SynchronizingDocumentStoreWrapper.java?rev=1582346&r1=1582345&r2=1582346&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/SynchronizingDocumentStoreWrapper.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/SynchronizingDocumentStoreWrapper.java
Thu Mar 27 15:18:49 2014
@@ -68,6 +68,13 @@ public class SynchronizingDocumentStoreW
}
@Override
+ public synchronized <T extends Document> void remove(Collection<T>
collection, List<String> keys) {
+ for(String key : keys){
+ remove(collection, key);
+ }
+ }
+
+ @Override
public synchronized <T extends Document> boolean create(final
Collection<T> collection, final List<UpdateOp> updateOps) {
return store.create(collection, updateOps);
}
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/TimingDocumentStoreWrapper.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/TimingDocumentStoreWrapper.java?rev=1582346&r1=1582345&r2=1582346&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/TimingDocumentStoreWrapper.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/TimingDocumentStoreWrapper.java
Thu Mar 27 15:18:49 2014
@@ -177,6 +177,14 @@ public class TimingDocumentStoreWrapper
}
@Override
+ public <T extends Document> void remove(Collection<T> collection,
List<String> keys) {
+ //TODO Timing
+ for(String key : keys){
+ remove(collection, key);
+ }
+ }
+
+ @Override
public <T extends Document> boolean create(Collection<T> collection,
List<UpdateOp> updateOps) {
try {
long start = now();
Modified:
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/MongoDocumentStoreTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/MongoDocumentStoreTest.java?rev=1582346&r1=1582345&r2=1582346&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/MongoDocumentStoreTest.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/MongoDocumentStoreTest.java
Thu Mar 27 15:18:49 2014
@@ -28,6 +28,7 @@ import java.util.concurrent.ExecutorServ
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
+import com.google.common.collect.Lists;
import org.apache.jackrabbit.oak.plugins.document.memory.MemoryDocumentStore;
import org.apache.jackrabbit.oak.plugins.document.mongo.MongoDocumentStore;
import org.apache.jackrabbit.oak.plugins.document.util.Utils;
@@ -105,6 +106,35 @@ public class MongoDocumentStoreTest {
}
@Test
+ public void batchRemove() throws Exception {
+ DocumentStore docStore = openDocumentStore();
+ int nUpdates = 10;
+ Revision r1 = new Revision(0, 0, 0);
+ List<String> ids = Lists.newArrayList();
+ List<UpdateOp> updateOps = new ArrayList<UpdateOp>();
+ for (int i = 0; i < nUpdates; i++) {
+ String path = "/node" + i;
+ UpdateOp updateOp = new UpdateOp(path, true);
+ updateOp.set(Document.ID, "/node" + i);
+ updateOp.setMapEntry("property1", r1, "value1");
+ updateOp.increment("property2", 1);
+ updateOp.set("property3", "value3");
+ updateOps.add(updateOp);
+ ids.add(updateOp.getId());
+ }
+ docStore.create(Collection.NODES, updateOps);
+
+ for(String id : ids){
+ assertNotNull(docStore.find(Collection.NODES, id));
+ }
+
+ docStore.remove(Collection.NODES, ids);
+ for(String id : ids){
+ assertNull(docStore.find(Collection.NODES, id));
+ }
+ }
+
+ @Test
public void batchAdd() throws Exception {
DocumentStore docStore = openDocumentStore();
Revision r1 = new Revision(0, 0, 0);