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;