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
+ }
+ }
}