HDFS-8593. Calculation of effective layout version mishandles comparison to current layout version in storage. Contributed by Chris Nauroth.
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/fb7f8ec1 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/fb7f8ec1 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/fb7f8ec1 Branch: refs/heads/YARN-2928 Commit: fb7f8ec15eab00fe1548d6d6cd758124fc0ea83c Parents: d6ff0e8 Author: cnauroth <[email protected]> Authored: Sat Jun 13 10:37:52 2015 -0700 Committer: Zhijie Shen <[email protected]> Committed: Thu Jun 18 11:10:05 2015 -0700 ---------------------------------------------------------------------- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 +++ .../hdfs/server/namenode/FSNamesystem.java | 17 ++++++++++++----- .../hdfs/server/namenode/TestFSNamesystem.java | 20 ++++++++++++++++++++ 3 files changed, 35 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/fb7f8ec1/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 51a0897..9aabd34 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 http://git-wip-us.apache.org/repos/asf/hadoop/blob/fb7f8ec1/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java ---------------------------------------------------------------------- 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 ef53692..f962373 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; } /** http://git-wip-us.apache.org/repos/asf/hadoop/blob/fb7f8ec1/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystem.java ---------------------------------------------------------------------- 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 8b0662c..26bb4f7 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)); + } }
