Browse Source

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

(cherry picked from commit bd7baea5a5d4ff351645e34c0ef09b7ba82f4285)
Akira Ajisaka 5 years ago
parent
commit
83f67cca60

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

@@ -568,6 +568,8 @@ public final class FSImageFormatProtobuf {
         FSImageCompression compression, String filePath) throws IOException {
       StartupProgress prog = NameNode.getStartupProgress();
       MessageDigest digester = MD5Hash.getDigester();
+      int layoutVersion =
+          context.getSourceNamesystem().getEffectiveLayoutVersion();
 
       underlyingOutputStream = new DigestOutputStream(new BufferedOutputStream(
           fout), digester);
@@ -594,11 +596,16 @@ public final class FSImageFormatProtobuf {
       // depends on this behavior.
       context.checkCancelled();
 
+      Step step;
+
       // 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);
       prog.beginStep(Phase.SAVING_CHECKPOINT, step);