Author: mreutegg
Date: Tue Jun 17 13:03:25 2014
New Revision: 1603155

URL: http://svn.apache.org/r1603155
Log:
OAK-1897: Stale documents in MongoDocumentStore cache

Add test (currently disabled)

Added:
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/CacheConsistencyTest.java
   (with props)
Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java

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=1603155&r1=1603154&r2=1603155&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
 Tue Jun 17 13:03:25 2014
@@ -754,8 +754,8 @@ public class MongoDocumentStore implemen
     }
 
     @CheckForNull
-    <T extends Document> T convertFromDBObject(@Nonnull Collection<T> 
collection,
-                                               @Nullable DBObject n) {
+    protected <T extends Document> T convertFromDBObject(@Nonnull 
Collection<T> collection,
+                                                         @Nullable DBObject n) 
{
         T copy = null;
         if (n != null) {
             copy = collection.newDocument(this);

Added: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/CacheConsistencyTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/CacheConsistencyTest.java?rev=1603155&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/CacheConsistencyTest.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/CacheConsistencyTest.java
 Tue Jun 17 13:03:25 2014
@@ -0,0 +1,121 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.plugins.document;
+
+import java.util.Map;
+import java.util.concurrent.Semaphore;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import org.apache.jackrabbit.oak.plugins.document.mongo.MongoDocumentStore;
+import org.apache.jackrabbit.oak.plugins.document.util.Utils;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import com.google.common.collect.Maps;
+import com.mongodb.DB;
+import com.mongodb.DBObject;
+
+import static org.apache.jackrabbit.oak.plugins.document.Collection.NODES;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Test for OAK-1897
+ */
+public class CacheConsistencyTest extends AbstractMongoConnectionTest {
+
+    private TestStore store;
+
+    @Before
+    @Override
+    public void setUpConnection() throws Exception {
+        mongoConnection = MongoUtils.getConnection();
+        DB db = mongoConnection.getDB();
+        MongoUtils.dropCollections(db);
+        DocumentMK.Builder builder = new DocumentMK.Builder()
+                .clock(getTestClock()).setAsyncDelay(0).setMongoDB(db);
+        store = new TestStore(db, builder);
+        mk = builder.setDocumentStore(store).open();
+    }
+
+    @Ignore("OAK-1897")
+    @Test
+    public void cacheConsistency() throws Exception {
+        mk.commit("/", "+\"node\":{}", null, null);
+        // add a child node. this will require an update
+        // of _lastRev on /node
+        mk.commit("/node", "+\"child\":{}", null, null);
+
+        // make sure the document is not cached
+        store.invalidateCache(NODES, Utils.getIdFromPath("/node"));
+
+        Thread t = new Thread(new Runnable() {
+            @Override
+            public void run() {
+                store.query(NODES,
+                        Utils.getKeyLowerLimit("/"),
+                        Utils.getKeyUpperLimit("/"), 10);
+            }
+        });
+        // block thread when it tries to convert db objects
+        store.semaphores.put(t, new Semaphore(0));
+        t.start();
+
+        while (!store.semaphores.get(t).hasQueuedThreads()) {
+            Thread.sleep(10);
+        }
+
+        // trigger write back of _lastRevs
+        mk.runBackgroundOperations();
+
+        // release thread
+        store.semaphores.get(t).release();
+        t.join();
+
+        NodeState root = mk.getNodeStore().getRoot();
+        assertTrue(root.getChildNode("node").getChildNode("child").exists());
+    }
+
+    private static final class TestStore extends MongoDocumentStore {
+
+        final Map<Thread, Semaphore> semaphores = Maps.newConcurrentMap();
+
+        TestStore(DB db, DocumentMK.Builder builder) {
+            super(db, builder);
+        }
+
+        @Override
+        protected <T extends Document> T convertFromDBObject(
+                @Nonnull Collection<T> collection, @Nullable DBObject n) {
+            Semaphore s = semaphores.get(Thread.currentThread());
+            if (s != null) {
+                s.acquireUninterruptibly();
+            }
+            try {
+                return super.convertFromDBObject(collection, n);
+            } finally {
+                if (s != null) {
+                    s.release();
+                }
+            }
+        }
+    }
+
+}

Propchange: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/CacheConsistencyTest.java
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to