浏览代码

HDFS-14396. Failed to load image from FSImageFile when downgrade from 3.x to 2.x. Contributed by Fei Hui.

Akira Ajisaka 5 年之前
父节点
当前提交
bd7baea5a5

+ 11 - 4
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSImageFormatProtobuf.java

@@ -813,6 +813,8 @@ public final class FSImageFormatProtobuf {
         FSImageCompression compression, String filePath) throws IOException {
         FSImageCompression compression, String filePath) throws IOException {
       StartupProgress prog = NameNode.getStartupProgress();
       StartupProgress prog = NameNode.getStartupProgress();
       MessageDigest digester = MD5Hash.getDigester();
       MessageDigest digester = MD5Hash.getDigester();
+      int layoutVersion =
+          context.getSourceNamesystem().getEffectiveLayoutVersion();
 
 
       underlyingOutputStream = new DigestOutputStream(new BufferedOutputStream(
       underlyingOutputStream = new DigestOutputStream(new BufferedOutputStream(
           fout), digester);
           fout), digester);
@@ -839,11 +841,16 @@ public final class FSImageFormatProtobuf {
       // depends on this behavior.
       // depends on this behavior.
       context.checkCancelled();
       context.checkCancelled();
 
 
+      Step step;
+
       // Erasure coding policies should be saved before inodes
       // Erasure coding policies should be saved before inodes
-      Step step = new Step(StepType.ERASURE_CODING_POLICIES, filePath);
-      prog.beginStep(Phase.SAVING_CHECKPOINT, step);
-      saveErasureCodingSection(b);
-      prog.endStep(Phase.SAVING_CHECKPOINT, step);
+      if (NameNodeLayoutVersion.supports(
+          NameNodeLayoutVersion.Feature.ERASURE_CODING, layoutVersion)) {
+        step = new Step(StepType.ERASURE_CODING_POLICIES, filePath);
+        prog.beginStep(Phase.SAVING_CHECKPOINT, step);
+        saveErasureCodingSection(b);
+        prog.endStep(Phase.SAVING_CHECKPOINT, step);
+      }
 
 
       step = new Step(StepType.INODES, filePath);
       step = new Step(StepType.INODES, filePath);
       prog.beginStep(Phase.SAVING_CHECKPOINT, step);
       prog.beginStep(Phase.SAVING_CHECKPOINT, step);