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;