Author: mreutegg
Date: Wed Aug 14 12:03:56 2019
New Revision: 1865110
URL: http://svn.apache.org/viewvc?rev=1865110&view=rev
Log:
OAK-8538: Incomplete recovery on long running merge with branch commits
Detect branch commits on recovery and enable tests
Modified:
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryAgent.java
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/AddNodesInBranchCommitWithRecoveryTest.java
Modified:
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryAgent.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryAgent.java?rev=1865110&r1=1865109&r2=1865110&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryAgent.java
(original)
+++
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryAgent.java
Wed Aug 14 12:03:56 2019
@@ -159,6 +159,15 @@ public class LastRevRecoveryAgent {
startTime = sweepRev.getTimestamp();
reason = "sweepRev: " + sweepRev.toString();
}
+ // are there branch commits that were merged right before the
+ // process crashed and the recovery needs to go further back?
+ // go through branch commits before startTime and check if
their
+ // merge revision is newer than startTime
+ Revision bc = getEarliestBranchCommitMergedAround(root,
startTime, clusterId);
+ if (bc != null) {
+ startTime = bc.getTimestamp();
+ reason = "branchRev: " + bc.toString();
+ }
return recoverCandidates(nodeInfo, startTime, waitUntil,
reason);
}
@@ -460,6 +469,38 @@ public class LastRevRecoveryAgent {
//--------------------------< internal
>------------------------------------
+ /**
+ * Get the earliest branch commit before {@code timeMillis} that has been
+ * merged after {@code timeMillis}. This method only considers branch
+ * commits performed by {@code clusterId}.
+ *
+ * @param doc the document to check for branch commits.
+ * @param timeMillis a time in milliseconds since start of the epoch.
+ * @param clusterId a clusterId.
+ * @return earliest branch commit or {@code null} if there is none matching
+ * the criteria.
+ */
+ @Nullable
+ private Revision getEarliestBranchCommitMergedAround(@NotNull NodeDocument
doc,
+ long timeMillis,
+ int clusterId) {
+ Revision earliest = null;
+ for (Revision bc : doc.getLocalBranchCommits()) {
+ if (bc.getClusterId() != clusterId) {
+ continue;
+ }
+ String cv = revisionContext.getCommitValue(bc, doc);
+ if (isCommitted(cv)) {
+ Revision mergeRevision = resolveCommitRevision(bc, cv);
+ if (mergeRevision.getTimestamp() > timeMillis
+ && bc.getTimestamp() < timeMillis) {
+ earliest = Utils.min(earliest, bc);
+ }
+ }
+ }
+ return earliest;
+ }
+
@Nullable
private NodeDocument findNearestAncestorOrSelf(@NotNull Path path,
@NotNull List<Path>
missingDocuments) {
Modified:
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/AddNodesInBranchCommitWithRecoveryTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/AddNodesInBranchCommitWithRecoveryTest.java?rev=1865110&r1=1865109&r2=1865110&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/AddNodesInBranchCommitWithRecoveryTest.java
(original)
+++
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/AddNodesInBranchCommitWithRecoveryTest.java
Wed Aug 14 12:03:56 2019
@@ -25,7 +25,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;
import org.slf4j.Logger;
@@ -35,7 +34,6 @@ import static org.apache.jackrabbit.oak.
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-@Ignore
public class AddNodesInBranchCommitWithRecoveryTest {
private static final Logger LOG =
LoggerFactory.getLogger(AddNodesInBranchCommitWithRecoveryTest.class);