Browse Source

HDFS-8593. Calculation of effective layout version mishandles comparison to current layout version in storage. Contributed by Chris Nauroth.

(cherry picked from commit b8341f1cd89791c51b396ad531ec7fcc631be149)
cnauroth 10 năm trước cách đây
mục cha
commit
92144ca75c

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

@@ -549,6 +549,9 @@ Release 2.8.0 - UNRELEASED
 
     HDFS-8554. TestDatanodeLayoutUpgrade fails on Windows. (cnauroth)
 
+    HDFS-8593. Calculation of effective layout version mishandles comparison to
+    current layout version in storage. (cnauroth)
+
 Release 2.7.1 - UNRELEASED
 
   INCOMPATIBLE CHANGES

+ 12 - 5
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java

@@ -6998,10 +6998,17 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
    * @return layout version in effect
    */
   public int getEffectiveLayoutVersion() {
-    if (isRollingUpgrade()) {
-      int storageLV = fsImage.getStorage().getLayoutVersion();
-      if (storageLV >=
-          NameNodeLayoutVersion.MINIMUM_COMPATIBLE_LAYOUT_VERSION) {
+    return getEffectiveLayoutVersion(isRollingUpgrade(),
+        fsImage.getStorage().getLayoutVersion(),
+        NameNodeLayoutVersion.MINIMUM_COMPATIBLE_LAYOUT_VERSION,
+        NameNodeLayoutVersion.CURRENT_LAYOUT_VERSION);
+  }
+
+  @VisibleForTesting
+  static int getEffectiveLayoutVersion(boolean isRollingUpgrade, int storageLV,
+      int minCompatLV, int currentLV) {
+    if (isRollingUpgrade) {
+      if (storageLV <= minCompatLV) {
         // The prior layout version satisfies the minimum compatible layout
         // version of the current software.  Keep reporting the prior layout
         // as the effective one.  Downgrade is possible.
@@ -7010,7 +7017,7 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
     }
     // The current software cannot satisfy the layout version of the prior
     // software.  Proceed with using the current layout version.
-    return NameNodeLayoutVersion.CURRENT_LAYOUT_VERSION;
+    return currentLV;
   }
 
   /**

+ 20 - 0
hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystem.java

@@ -213,4 +213,24 @@ public class TestFSNamesystem {
     fsn.imageLoadComplete();
     assertTrue(fsn.isImageLoaded());
   }
+
+  @Test
+  public void testGetEffectiveLayoutVersion() {
+    assertEquals(-63,
+        FSNamesystem.getEffectiveLayoutVersion(true, -60, -61, -63));
+    assertEquals(-61,
+        FSNamesystem.getEffectiveLayoutVersion(true, -61, -61, -63));
+    assertEquals(-62,
+        FSNamesystem.getEffectiveLayoutVersion(true, -62, -61, -63));
+    assertEquals(-63,
+        FSNamesystem.getEffectiveLayoutVersion(true, -63, -61, -63));
+    assertEquals(-63,
+        FSNamesystem.getEffectiveLayoutVersion(false, -60, -61, -63));
+    assertEquals(-63,
+        FSNamesystem.getEffectiveLayoutVersion(false, -61, -61, -63));
+    assertEquals(-63,
+        FSNamesystem.getEffectiveLayoutVersion(false, -62, -61, -63));
+    assertEquals(-63,
+        FSNamesystem.getEffectiveLayoutVersion(false, -63, -61, -63));
+  }
 }