diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 57a82cc129e..614fd30861b 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -90,6 +90,9 @@ Release 0.23.3 - UNRELEASED HDFS-2895. Remove Writable wire protocol types and translators to complete transition to protocol buffers. (suresh) + HDFS-2992. Edit log failure trace should include transaction ID of + error. (Colin Patrick McCabe via eli) + OPTIMIZATIONS BUG FIXES diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogLoader.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogLoader.java index 4ea0f110a38..67b5de43b73 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogLoader.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogLoader.java @@ -117,21 +117,20 @@ int loadEditRecords(int logVersion, EditLogInputStream in, boolean closeOnExit, long recentOpcodeOffsets[] = new long[4]; Arrays.fill(recentOpcodeOffsets, -1); + long txId = expectedStartingTxId - 1; try { - long txId = expectedStartingTxId - 1; - try { FSEditLogOp op; while ((op = in.readOp()) != null) { recentOpcodeOffsets[numEdits % recentOpcodeOffsets.length] = in.getPosition(); if (LayoutVersion.supports(Feature.STORED_TXIDS, logVersion)) { - long thisTxId = op.txid; - if (thisTxId != txId + 1) { + long expectedTxId = txId + 1; + txId = op.txid; + if (txId != expectedTxId) { throw new IOException("Expected transaction ID " + - (txId + 1) + " but got " + thisTxId); + expectedTxId + " but got " + txId); } - txId = thisTxId; } numEdits++; @@ -415,6 +414,7 @@ int loadEditRecords(int logVersion, EditLogInputStream in, boolean closeOnExit, // sort of error might be thrown (NumberFormat, NullPointer, EOF, etc.) StringBuilder sb = new StringBuilder(); sb.append("Error replaying edit log at offset " + in.getPosition()); + sb.append("On transaction ID ").append(txId); if (recentOpcodeOffsets[0] != -1) { Arrays.sort(recentOpcodeOffsets); sb.append("\nRecent opcode offsets:"); diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSEditLogLoader.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSEditLogLoader.java index e8207053971..dcbeea6c2f0 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSEditLogLoader.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSEditLogLoader.java @@ -90,15 +90,17 @@ public void testDisplayRecentEditLogOpCodes() throws IOException { } rwf.close(); - String expectedErrorMessage = "^Error replaying edit log at offset \\d+\n"; - expectedErrorMessage += "Recent opcode offsets: (\\d+\\s*){4}$"; + StringBuilder bld = new StringBuilder(); + bld.append("^Error replaying edit log at offset \\d+"); + bld.append("On transaction ID \\d+\n"); + bld.append("Recent opcode offsets: (\\d+\\s*){4}$"); try { cluster = new MiniDFSCluster.Builder(conf).numDataNodes(NUM_DATA_NODES) .format(false).build(); fail("should not be able to start"); } catch (IOException e) { assertTrue("error message contains opcodes message", - e.getMessage().matches(expectedErrorMessage)); + e.getMessage().matches(bld.toString())); } }