瀏覽代碼

HDFS-2872. Add sanity checks during edits loading that generation stamps are non-decreasing. Contributed by Colin Patrick McCabe

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1@1298031 13f79535-47bb-0310-9956-ffa450edef68
Eli Collins 13 年之前
父節點
當前提交
efdc7785b6
共有 2 個文件被更改,包括 9 次插入2 次删除
  1. 2 0
      CHANGES.txt
  2. 7 2
      src/hdfs/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java

+ 2 - 0
CHANGES.txt

@@ -156,6 +156,8 @@ Release 1.1.0 - unreleased
 
 
     HDFS-2741. Document the max transfer threads property for branch-1. Backport of HDFS-1866. (Markus Jelsma via harsh)
     HDFS-2741. Document the max transfer threads property for branch-1. Backport of HDFS-1866. (Markus Jelsma via harsh)
 
 
+    HDFS-2872. Add sanity checks during edits loading that generation
+    stamps are non-decreasing. (Colin Patrick McCabe via eli)
 
 
 Release 1.0.2 - unreleased
 Release 1.0.2 - unreleased
 
 

+ 7 - 2
src/hdfs/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java

@@ -499,7 +499,7 @@ public class FSEditLog {
         numOpTimes = 0, numOpGetDelegationToken = 0,
         numOpTimes = 0, numOpGetDelegationToken = 0,
         numOpRenewDelegationToken = 0, numOpCancelDelegationToken = 0,
         numOpRenewDelegationToken = 0, numOpCancelDelegationToken = 0,
         numOpUpdateMasterKey = 0, numOpOther = 0;
         numOpUpdateMasterKey = 0, numOpOther = 0;
-
+    long highestGenStamp = -1;
     long startTime = FSNamesystem.now();
     long startTime = FSNamesystem.now();
 
 
     DataInputStream in = new DataInputStream(new BufferedInputStream(edits));
     DataInputStream in = new DataInputStream(new BufferedInputStream(edits));
@@ -710,9 +710,14 @@ public class FSEditLog {
         case OP_SET_GENSTAMP: {
         case OP_SET_GENSTAMP: {
           numOpSetGenStamp++;
           numOpSetGenStamp++;
           long lw = in.readLong();
           long lw = in.readLong();
+          if ((highestGenStamp != -1) && (highestGenStamp + 1 != lw)) {
+            throw new IOException("OP_SET_GENSTAMP tried to set a genstamp of " + lw + 
+              " but the previous highest genstamp was " + highestGenStamp);
+          }
+          highestGenStamp = lw;
           fsDir.namesystem.setGenerationStamp(lw);
           fsDir.namesystem.setGenerationStamp(lw);
           break;
           break;
-        } 
+        }
         case OP_DATANODE_ADD: {
         case OP_DATANODE_ADD: {
           numOpOther++;
           numOpOther++;
           FSImage.DatanodeImage nodeimage = new FSImage.DatanodeImage();
           FSImage.DatanodeImage nodeimage = new FSImage.DatanodeImage();