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 mr...@apache.org on 2019/09/24 13:14:18 UTC

svn commit: r1867456 - in /jackrabbit/oak/trunk/oak-store-document/src: main/java/org/apache/jackrabbit/oak/plugins/document/ test/java/org/apache/jackrabbit/oak/plugins/document/

Author: mreutegg
Date: Tue Sep 24 13:14:17 2019
New Revision: 1867456

URL: http://svn.apache.org/viewvc?rev=1867456&view=rev
Log:
OAK-8627: Avoid late-arriving lastRev update from crashed instance

Apply most recent patch with proposed changes

Modified:
    jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
    jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/UnsavedModifications.java
    jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreBackgroundUpdateTest.java
    jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/JournalTest.java
    jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryAgentTest.java
    jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/TestUtils.java

Modified: jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java?rev=1867456&r1=1867455&r2=1867456&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java Tue Sep 24 13:14:17 2019
@@ -1866,6 +1866,13 @@ public final class NodeDocument extends
                 revision.toString());
     }
 
+    public static void hasLastRev(@NotNull UpdateOp op,
+                                  @NotNull Revision revision) {
+        checkNotNull(op).equals(LAST_REV,
+                new Revision(0, 0, revision.getClusterId()),
+                revision.toString());
+    }
+
     //----------------------------< internal >----------------------------------
 
     private void previousDocumentNotFound(String prevId, Revision rev) {

Modified: jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/UnsavedModifications.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/UnsavedModifications.java?rev=1867456&r1=1867455&r2=1867456&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/UnsavedModifications.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/UnsavedModifications.java Tue Sep 24 13:14:17 2019
@@ -206,7 +206,15 @@ class UnsavedModifications {
                 NodeDocument.setSweepRevision(rootUpdate, sweepRev);
                 LOG.debug("Updating _sweepRev to {}", sweepRev);
             }
-            store.findAndUpdate(NODES, rootUpdate);
+            // ensure lastRev is not updated by someone else in the meantime
+            Revision lastRev = Utils.getRootDocument(store).getLastRev().get(rootRev.getClusterId());
+            if (lastRev != null) {
+                NodeDocument.hasLastRev(rootUpdate, lastRev);
+            }
+            if (store.findAndUpdate(NODES, rootUpdate) == null) {
+                throw new DocumentStoreException("Update of root document to _lastRev " +
+                        rootRev + " failed. Detected concurrent update");
+            }
             stats.calls++;
             map.remove(Path.ROOT, rootRev);
             LOG.debug("Updated _lastRev to {} on {}", rootRev, Path.ROOT);

Modified: jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreBackgroundUpdateTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreBackgroundUpdateTest.java?rev=1867456&r1=1867455&r2=1867456&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreBackgroundUpdateTest.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreBackgroundUpdateTest.java Tue Sep 24 13:14:17 2019
@@ -31,7 +31,6 @@ import org.apache.jackrabbit.oak.spi.sta
 import org.apache.jackrabbit.oak.stats.Clock;
 import org.junit.AfterClass;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 
@@ -43,7 +42,6 @@ import static org.junit.Assert.assertNot
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.fail;
 
-@Ignore("OAK-8627")
 public class DocumentNodeStoreBackgroundUpdateTest {
 
     @Rule

Modified: jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/JournalTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/JournalTest.java?rev=1867456&r1=1867455&r2=1867456&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/JournalTest.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/JournalTest.java Tue Sep 24 13:14:17 2019
@@ -422,6 +422,13 @@ public class JournalTest extends Abstrac
                             ready.countDown();
                             start.await();
                             recovery.recover(Lists.newArrayList(x1,z1), c2Id);
+                        } catch (DocumentStoreException e) {
+                            if (e.getMessage().matches("Update of root document to _lastRev .* failed. Detected concurrent update")) {
+                                // we have to accept this exception to happen
+                                end.countDown();
+                            } else {
+                                exceptions.add(e);
+                            }
                         } catch (Exception e) {
                             exceptions.add(e);
                         } finally {

Modified: jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryAgentTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryAgentTest.java?rev=1867456&r1=1867455&r2=1867456&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryAgentTest.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryAgentTest.java Tue Sep 24 13:14:17 2019
@@ -29,6 +29,7 @@ import org.apache.jackrabbit.oak.spi.sta
 import org.junit.Test;
 
 import static org.apache.jackrabbit.oak.plugins.document.Collection.NODES;
+import static org.apache.jackrabbit.oak.plugins.document.TestUtils.disposeQuietly;
 import static org.apache.jackrabbit.oak.plugins.document.util.Utils.getIdFromPath;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -79,6 +80,9 @@ public class LastRevRecoveryAgentTest ex
         assertEquals(zlastRev2, getDocument(ds1, "/x/y").getLastRev().get(c2Id));
         assertEquals(zlastRev2, getDocument(ds1, "/x").getLastRev().get(c2Id));
         assertEquals(zlastRev2, getDocument(ds1, "/").getLastRev().get(c2Id));
+
+        // dispose ds2 quietly because it may now throw an exception
+        disposeQuietly(ds2);
     }
 
     //OAK-5337
@@ -152,6 +156,9 @@ public class LastRevRecoveryAgentTest ex
         assertTrue(ds1.getLastRevRecoveryAgent().isRecoveryNeeded());
         ds1.getLastRevRecoveryAgent().performRecoveryIfNeeded();
         assertFalse(ds1.getLastRevRecoveryAgent().isRecoveryNeeded());
+
+        // dispose ds2 quietly because it may now throw an exception
+        disposeQuietly(ds2);
     }
 
     @Test
@@ -193,6 +200,9 @@ public class LastRevRecoveryAgentTest ex
         b1 = ds1.getRoot().builder();
         b1.child("x").child("y").setProperty("p", "v11");
         merge(ds1, b1);
+
+        // dispose ds2 quietly because it may now throw an exception
+        disposeQuietly(ds2);
     }
 
     @Test

Modified: jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/TestUtils.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/TestUtils.java?rev=1867456&r1=1867455&r2=1867456&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/TestUtils.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/TestUtils.java Tue Sep 24 13:14:17 2019
@@ -124,4 +124,12 @@ public class TestUtils {
         }
         return finalUpdate;
     }
+
+    public static void disposeQuietly(DocumentNodeStore ns) {
+        try {
+            ns.dispose();
+        } catch (Exception e) {
+            // ignore
+        }
+    }
 }