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


Reply via email to