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;


Reply via email to