From b8341f1cd89791c51b396ad531ec7fcc631be149 Mon Sep 17 00:00:00 2001 From: cnauroth Date: Sat, 13 Jun 2015 10:37:52 -0700 Subject: [PATCH] HDFS-8593. Calculation of effective layout version mishandles comparison to current layout version in storage. Contributed by Chris Nauroth. --- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 +++ .../hdfs/server/namenode/FSNamesystem.java | 17 +++++++++++----- .../server/namenode/TestFSNamesystem.java | 20 +++++++++++++++++++ 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 51a08973487..9aabd342ac9 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -886,6 +886,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 diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java index ef53692c444..f962373b605 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java @@ -7004,10 +7004,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. @@ -7016,7 +7023,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; } /** diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystem.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystem.java index 8b0662c4833..26bb4f7c69d 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystem.java +++ b/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)); + } }