Author: reschke
Date: Tue Jun 28 12:31:42 2016
New Revision: 1750495
URL: http://svn.apache.org/viewvc?rev=1750495&view=rev
Log:
OAK-4494: Stale documents after revision GC in cluster
Fixes specific to RDBDocumentStore.
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentSerializer.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ResurrectNodeAfterRevisionGCTest.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentSerializer.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentSerializer.java?rev=1750495&r1=1750494&r2=1750495&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentSerializer.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentSerializer.java
Tue Jun 28 12:31:42 2016
@@ -146,7 +146,9 @@ public class RDBDocumentSerializer {
public <T extends Document> T fromRow(@Nonnull Collection<T> collection,
@Nonnull RDBRow row) throws DocumentStoreException {
T doc = collection.newDocument(store);
doc.put(ID, row.getId());
- doc.put(MODIFIED, row.getModified());
+ if (row.getModified() != 0) {
+ doc.put(MODIFIED, row.getModified());
+ }
doc.put(MODCOUNT, row.getModcount());
if (RDBDocumentStore.USECMODCOUNT) {
doc.put(CMODCOUNT, row.getCollisionsModcount());
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java?rev=1750495&r1=1750494&r2=1750495&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
Tue Jun 28 12:31:42 2016
@@ -1419,14 +1419,21 @@ public class RDBDocumentStore implements
} else {
// we got a document from the cache, thus collection is
NODES
// and a tracker is present
- Lock lock = locks.acquire(row.getId());
- try {
- if (!tracker.mightBeenAffected(row.getId())) {
- // otherwise mark it as fresh
- ((NodeDocument) doc).markUpToDate(now);
+ long lastmodified = modifiedOf(doc);
+ if (lastmodified == row.getModified() && lastmodified >=
1) {
+ Lock lock = locks.acquire(row.getId());
+ try {
+ if (!tracker.mightBeenAffected(row.getId())) {
+ // otherwise mark it as fresh
+ ((NodeDocument) doc).markUpToDate(now);
+ }
+ } finally {
+ lock.unlock();
}
- } finally {
- lock.unlock();
+ }
+ else {
+ // we need a fresh document instance
+ doc = convertFromDBObject(collection, row);
}
}
result.add(doc);
@@ -1466,9 +1473,10 @@ public class RDBDocumentStore implements
final Stopwatch watch = startWatch();
boolean docFound = true;
try {
- long lastmodcount = -1;
+ long lastmodcount = -1, lastmodified = -1;
if (cachedDoc != null) {
lastmodcount = modcountOf(cachedDoc);
+ lastmodified = modifiedOf(cachedDoc);
}
connection = this.ch.getROConnection();
RDBRow row = db.read(connection, tmd, id, lastmodcount);
@@ -1477,11 +1485,18 @@ public class RDBDocumentStore implements
docFound = false;
return null;
} else {
- if (lastmodcount == row.getModcount()) {
+ if (lastmodcount == row.getModcount() && lastmodified ==
row.getModified() && lastmodified >= 1) {
// we can re-use the cached document
cachedDoc.markUpToDate(System.currentTimeMillis());
return castAsT(cachedDoc);
} else {
+ // workaround: need to re-read if data is not present
+ // that would be the case if the modcount did match but
the modified time did not
+ // see OAK-4509
+ if (row.getData() == null) {
+ row = db.read(connection, tmd, id, -1);
+ connection.commit();
+ }
return convertFromDBObject(collection, row);
}
}
@@ -1812,6 +1827,11 @@ public class RDBDocumentStore implements
return n != null ? n : -1;
}
+ private static long modifiedOf(@Nonnull Document doc) {
+ Object l = doc.get(NodeDocument.MODIFIED_IN_SECS);
+ return (l instanceof Long) ? ((Long)l).longValue() : -1;
+ }
+
@Nonnull
protected <T extends Document> T convertFromDBObject(@Nonnull
Collection<T> collection, @Nonnull RDBRow row) {
// this method is present here in order to facilitate unit testing for
OAK-3566
Modified:
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ResurrectNodeAfterRevisionGCTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ResurrectNodeAfterRevisionGCTest.java?rev=1750495&r1=1750494&r2=1750495&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ResurrectNodeAfterRevisionGCTest.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ResurrectNodeAfterRevisionGCTest.java
Tue Jun 28 12:31:42 2016
@@ -38,7 +38,6 @@ import static org.junit.Assert.assertFal
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
-import static org.junit.Assume.assumeFalse;
public class ResurrectNodeAfterRevisionGCTest
extends AbstractMultiDocumentStoreTest {
@@ -49,7 +48,6 @@ public class ResurrectNodeAfterRevisionG
public ResurrectNodeAfterRevisionGCTest(DocumentStoreFixture dsf) {
super(dsf);
- assumeFalse(dsf instanceof DocumentStoreFixture.RDBFixture);
}
@Before