HDFS-13145. SBN crash when transition to ANN with in-progress edit tailing enabled. Contributed by Chao Sun.
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/b7203dd2 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/b7203dd2 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/b7203dd2 Branch: refs/heads/YARN-7055 Commit: b7203dd26980a88aea8b4d47db9726d2b3774ac2 Parents: 854001e Author: Chao Sun <[email protected]> Authored: Mon Feb 26 15:37:27 2018 -0800 Committer: Rohith Sharma K S <[email protected]> Committed: Fri Mar 2 11:08:28 2018 +0530 ---------------------------------------------------------------------- .../qjournal/client/QuorumJournalManager.java | 4 ++- .../client/TestQuorumJournalManager.java | 26 +++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/b7203dd2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/qjournal/client/QuorumJournalManager.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/qjournal/client/QuorumJournalManager.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/qjournal/client/QuorumJournalManager.java index 7dff9b4..7a70a3d 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/qjournal/client/QuorumJournalManager.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/qjournal/client/QuorumJournalManager.java @@ -496,7 +496,9 @@ public class QuorumJournalManager implements JournalManager { // If it's bounded by durable Txns, endTxId could not be larger // than committedTxnId. This ensures the consistency. - if (onlyDurableTxns && inProgressOk) { + // We don't do the following for finalized log segments, since all + // edits in those are guaranteed to be committed. + if (onlyDurableTxns && inProgressOk && remoteLog.isInProgress()) { endTxId = Math.min(endTxId, committedTxnId); if (endTxId < remoteLog.getStartTxId()) { LOG.warn("Found endTxId (" + endTxId + ") that is less than " + http://git-wip-us.apache.org/repos/asf/hadoop/blob/b7203dd2/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/qjournal/client/TestQuorumJournalManager.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/qjournal/client/TestQuorumJournalManager.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/qjournal/client/TestQuorumJournalManager.java index ce1d404..34a0348 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/qjournal/client/TestQuorumJournalManager.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/qjournal/client/TestQuorumJournalManager.java @@ -933,7 +933,31 @@ public class TestQuorumJournalManager { verifyEdits(streams, 25, 50); } - + + @Test + public void testInProgressRecovery() throws Exception { + // Test the case when in-progress edit log tailing is on, and + // new active performs recovery when the old active crashes + // without closing the last log segment. + // See HDFS-13145 for more details. + + // Write two batches of edits. After these, the commitId on the + // journals should be 5, and endTxnId should be 8. + EditLogOutputStream stm = qjm.startLogSegment(1, + NameNodeLayoutVersion.CURRENT_LAYOUT_VERSION); + writeTxns(stm, 1, 5); + writeTxns(stm, 6, 3); + + // Do recovery from a separate QJM, just like in failover. + QuorumJournalManager qjm2 = createSpyingQJM(); + qjm2.recoverUnfinalizedSegments(); + checkRecovery(cluster, 1, 8); + + // When selecting input stream, we should see all txns up to 8. + List<EditLogInputStream> streams = new ArrayList<>(); + qjm2.selectInputStreams(streams, 1, true, true); + verifyEdits(streams, 1, 8); + } private QuorumJournalManager createSpyingQJM() throws IOException, URISyntaxException { --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
