From 0faf50624580b86b64a828cdbbb630ae8994e2cd Mon Sep 17 00:00:00 2001 From: Wei-Chiu Chuang Date: Fri, 1 Dec 2017 12:01:21 -0800 Subject: [PATCH] HDFS-12836. startTxId could be greater than endTxId when tailing in-progress edit log. Contributed by Chao Sun. --- .../qjournal/client/QuorumJournalManager.java | 6 ++++++ .../ha/TestStandbyInProgressTail.java | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+) 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 d30625b533d..7dff9b4a73c 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 @@ -498,6 +498,12 @@ public class QuorumJournalManager implements JournalManager { // than committedTxnId. This ensures the consistency. if (onlyDurableTxns && inProgressOk) { endTxId = Math.min(endTxId, committedTxnId); + if (endTxId < remoteLog.getStartTxId()) { + LOG.warn("Found endTxId (" + endTxId + ") that is less than " + + "the startTxId (" + remoteLog.getStartTxId() + + ") - setting it to startTxId."); + endTxId = remoteLog.getStartTxId(); + } } EditLogInputStream elis = EditLogFileInputStream.fromUrl( diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestStandbyInProgressTail.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestStandbyInProgressTail.java index 9201cdacbe0..b1cd03748c5 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestStandbyInProgressTail.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestStandbyInProgressTail.java @@ -309,6 +309,25 @@ public class TestStandbyInProgressTail { assertNotNull(NameNodeAdapter.getFileInfo(nn1, "/test3", true)); } + @Test + public void testNonUniformConfig() throws Exception { + // Test case where some NNs (in this case the active NN) in the cluster + // do not have in-progress tailing enabled. + Configuration newConf = cluster.getNameNode(0).getConf(); + newConf.setBoolean( + DFSConfigKeys.DFS_HA_TAILEDITS_INPROGRESS_KEY, + false); + cluster.restartNameNode(0); + cluster.transitionToActive(0); + + cluster.getNameNode(0).getRpcServer().mkdirs("/test", + FsPermission.createImmutable((short) 0755), true); + cluster.getNameNode(0).getRpcServer().rollEdits(); + + cluster.getNameNode(1).getNamesystem().getEditLogTailer().doTailEdits(); + assertNotNull(NameNodeAdapter.getFileInfo(nn1, "/test", true)); + } + /** * Check that no edits files are present in the given storage dirs. */