瀏覽代碼

HDFS-2992. Edit log failure trace should include transaction ID of error. Contributed by Colin Patrick McCabe

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1295227 13f79535-47bb-0310-9956-ffa450edef68
Eli Collins 13 年之前
父節點
當前提交
fbf3a9ee3d

+ 3 - 0
hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt

@@ -207,6 +207,9 @@ Release 0.23.3 - UNRELEASED
     HDFS-2895. Remove Writable wire protocol types and translators to
     HDFS-2895. Remove Writable wire protocol types and translators to
     complete transition to protocol buffers. (suresh)
     complete transition to protocol buffers. (suresh)
 
 
+    HDFS-2992. Edit log failure trace should include transaction ID of
+    error.  (Colin Patrick McCabe via eli)
+
   OPTIMIZATIONS
   OPTIMIZATIONS
 
 
     HDFS-3024. Improve performance of stringification in addStoredBlock (todd)
     HDFS-3024. Improve performance of stringification in addStoredBlock (todd)

+ 6 - 6
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogLoader.java

@@ -117,21 +117,20 @@ public class FSEditLogLoader {
     long recentOpcodeOffsets[] = new long[4];
     long recentOpcodeOffsets[] = new long[4];
     Arrays.fill(recentOpcodeOffsets, -1);
     Arrays.fill(recentOpcodeOffsets, -1);
 
 
+    long txId = expectedStartingTxId - 1;
     try {
     try {
-      long txId = expectedStartingTxId - 1;
-
       try {
       try {
         FSEditLogOp op;
         FSEditLogOp op;
         while ((op = in.readOp()) != null) {
         while ((op = in.readOp()) != null) {
           recentOpcodeOffsets[numEdits % recentOpcodeOffsets.length] =
           recentOpcodeOffsets[numEdits % recentOpcodeOffsets.length] =
             in.getPosition();
             in.getPosition();
           if (LayoutVersion.supports(Feature.STORED_TXIDS, logVersion)) {
           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 " +
               throw new IOException("Expected transaction ID " +
-                  (txId + 1) + " but got " + thisTxId);
+                  expectedTxId + " but got " + txId);
             }
             }
-            txId = thisTxId;
           }
           }
 
 
           numEdits++;
           numEdits++;
@@ -415,6 +414,7 @@ public class FSEditLogLoader {
       // sort of error might be thrown (NumberFormat, NullPointer, EOF, etc.)
       // sort of error might be thrown (NumberFormat, NullPointer, EOF, etc.)
       StringBuilder sb = new StringBuilder();
       StringBuilder sb = new StringBuilder();
       sb.append("Error replaying edit log at offset " + in.getPosition());
       sb.append("Error replaying edit log at offset " + in.getPosition());
+      sb.append("On transaction ID ").append(txId);
       if (recentOpcodeOffsets[0] != -1) {
       if (recentOpcodeOffsets[0] != -1) {
         Arrays.sort(recentOpcodeOffsets);
         Arrays.sort(recentOpcodeOffsets);
         sb.append("\nRecent opcode offsets:");
         sb.append("\nRecent opcode offsets:");

+ 5 - 3
hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSEditLogLoader.java

@@ -90,15 +90,17 @@ public class TestFSEditLogLoader {
     }
     }
     rwf.close();
     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 {
     try {
       cluster = new MiniDFSCluster.Builder(conf).numDataNodes(NUM_DATA_NODES)
       cluster = new MiniDFSCluster.Builder(conf).numDataNodes(NUM_DATA_NODES)
           .format(false).build();
           .format(false).build();
       fail("should not be able to start");
       fail("should not be able to start");
     } catch (IOException e) {
     } catch (IOException e) {
       assertTrue("error message contains opcodes message",
       assertTrue("error message contains opcodes message",
-          e.getMessage().matches(expectedErrorMessage));
+          e.getMessage().matches(bld.toString()));
     }
     }
   }
   }