Browse Source

HDFS-2085. Finalize in-progress edit logs at startup. Contributed by Todd Lipcon.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/HDFS-1073@1138162 13f79535-47bb-0310-9956-ffa450edef68
Todd Lipcon 14 years ago
parent
commit
abb1adc778

+ 1 - 0
hdfs/CHANGES.HDFS-1073.txt

@@ -52,3 +52,4 @@ HDFS-2027. Image inspector should return finalized logs before unfinalized
            logs. (todd)
 HDFS-2074. Determine edit log validity by truly reading and validating
            transactions. (todd)
+HDFS-2085. Finalize in-progress edit logs at startup. (todd)

+ 16 - 1
hdfs/src/java/org/apache/hadoop/hdfs/server/namenode/FSImageTransactionalStorageInspector.java

@@ -434,6 +434,8 @@ class FSImageTransactionalStorageInspector extends FSImageStorageInspector {
       for (FoundEditLog log : logs) {
         if (log.isCorrupt()) {
           log.moveAsideCorruptFile();
+        } else if (log.isInProgress()) {
+          log.finalizeLog();
         }
       }
     }    
@@ -476,7 +478,7 @@ class FSImageTransactionalStorageInspector extends FSImageStorageInspector {
     final StorageDirectory sd;
     File file;
     final long startTxId;
-    final long lastTxId;
+    long lastTxId;
     
     private EditLogValidation cachedValidation = null;
     private boolean isCorrupt = false;
@@ -495,6 +497,19 @@ class FSImageTransactionalStorageInspector extends FSImageStorageInspector {
       this.file = file;
     }
     
+    public void finalizeLog() throws IOException {
+      long numTransactions = validateLog().numTransactions;
+      long lastTxId = startTxId + numTransactions - 1;
+      File dst = new File(file.getParentFile(),
+          NNStorage.getFinalizedEditsFileName(startTxId, lastTxId));
+      if (!file.renameTo(dst)) {
+        throw new IOException("Couldn't finalize log " +
+            file + " to " + dst);
+      }
+      this.lastTxId = lastTxId;
+      file = dst;
+    }
+
     long getStartTxId() {
       return startTxId;
     }

+ 4 - 0
hdfs/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestFSImageStorageInspector.java

@@ -271,10 +271,14 @@ public class TestFSImageStorageInspector {
     // Calling recover should move it aside
     FoundEditLog badLog = lg.logs.get(2);
     Mockito.doNothing().when(badLog).moveAsideCorruptFile();
+    Mockito.doNothing().when(lg.logs.get(0)).finalizeLog();
+    Mockito.doNothing().when(lg.logs.get(1)).finalizeLog();
     
     lg.recover();
     
     Mockito.verify(badLog).moveAsideCorruptFile();
+    Mockito.verify(lg.logs.get(0)).finalizeLog();
+    Mockito.verify(lg.logs.get(1)).finalizeLog();
   }
   
   /**