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 re...@apache.org on 2016/06/24 12:01:09 UTC

svn commit: r1750078 - in /jackrabbit/oak/branches/1.4/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java test/java/org/apache/jackrabbit/oak/plugins/document/ConcurrentQueryAndInvalidateIT.java

Author: reschke
Date: Fri Jun 24 12:01:08 2016
New Revision: 1750078

URL: http://svn.apache.org/viewvc?rev=1750078&view=rev
Log:
OAK-4497: RDBDocumentStore: potential race condition between update and invalidate can cause stale cache entries (1.4)

(change differs from trunk because of refactoring for OAK-4112)

Modified:
    jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
    jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ConcurrentQueryAndInvalidateIT.java

Modified: jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java?rev=1750078&r1=1750077&r2=1750078&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java (original)
+++ jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java Fri Jun 24 12:01:08 2016
@@ -516,6 +516,9 @@ public class RDBDocumentStore implements
 
     private <T extends Document> void invalidateCache(Collection<T> collection, String id, boolean remove) {
         if (collection == Collection.NODES) {
+            for (QueryContext qc : qmap.values()) {
+                qc.addKey(id);
+            }
             invalidateNodesCache(id, remove);
         }
     }
@@ -1889,7 +1892,15 @@ public class RDBDocumentStore implements
             }
             if (modCount <= cachedModCount) {
                 // we can use the cached document
-                inCache.markUpToDate(now);
+                Lock lock = locks.acquire(row.getId());
+                try {
+                    if (qp.mayUpdate(id)) {
+                        inCache.markUpToDate(now);
+                    }
+                }
+                finally {
+                    lock.unlock();
+                }
                 return castAsT(inCache);
             }
         }

Modified: jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ConcurrentQueryAndInvalidateIT.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ConcurrentQueryAndInvalidateIT.java?rev=1750078&r1=1750077&r2=1750078&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ConcurrentQueryAndInvalidateIT.java (original)
+++ jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ConcurrentQueryAndInvalidateIT.java Fri Jun 24 12:01:08 2016
@@ -29,13 +29,11 @@ import static org.apache.jackrabbit.oak.
 import static org.apache.jackrabbit.oak.plugins.document.util.Utils.getKeyUpperLimit;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assume.assumeFalse;
 
 public class ConcurrentQueryAndInvalidateIT extends AbstractMultiDocumentStoreTest {
 
     public ConcurrentQueryAndInvalidateIT(DocumentStoreFixture dsf) {
         super(dsf);
-        assumeFalse(dsf instanceof DocumentStoreFixture.RDBFixture);
     }
 
     protected static final int NUM_NODES = 50;