You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by sz...@apache.org on 2014/10/14 03:29:21 UTC

git commit: HDFS-7237. The command "hdfs namenode -rollingUpgrade" throws ArrayIndexOutOfBoundsException.

Repository: hadoop
Updated Branches:
  refs/heads/trunk 0e57aa3bf -> f6d0b8892


HDFS-7237. The command "hdfs namenode -rollingUpgrade" throws ArrayIndexOutOfBoundsException.


Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/f6d0b889
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/f6d0b889
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/f6d0b889

Branch: refs/heads/trunk
Commit: f6d0b8892ab116514fd031a61441141ac3bdfeb5
Parents: 0e57aa3
Author: Tsz-Wo Nicholas Sze <sz...@hortonworks.com>
Authored: Mon Oct 13 18:28:34 2014 -0700
Committer: Tsz-Wo Nicholas Sze <sz...@hortonworks.com>
Committed: Mon Oct 13 18:28:34 2014 -0700

----------------------------------------------------------------------
 hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt     |  3 ++
 .../hdfs/server/common/HdfsServerConstants.java |  9 ++++
 .../hadoop/hdfs/server/namenode/NameNode.java   | 13 +++---
 .../datanode/TestHdfsServerConstants.java       | 17 +++++---
 .../namenode/TestNameNodeOptionParsing.java     | 45 ++++++++++++++++++++
 5 files changed, 75 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hadoop/blob/f6d0b889/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 2109608..b82014e 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
+++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
@@ -945,6 +945,9 @@ Release 2.6.0 - UNRELEASED
 
     HDFS-6544. Broken Link for GFS in package.html. (Suraj Nayak M via wheat9)
 
+    HDFS-7237. The command "hdfs namenode -rollingUpgrade" throws
+    ArrayIndexOutOfBoundsException.  (szetszwo)
+
     BREAKDOWN OF HDFS-6134 AND HADOOP-10150 SUBTASKS AND RELATED JIRAS
   
       HDFS-6387. HDFS CLI admin tool for creating & deleting an

http://git-wip-us.apache.org/repos/asf/hadoop/blob/f6d0b889/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/common/HdfsServerConstants.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/common/HdfsServerConstants.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/common/HdfsServerConstants.java
index 767c1b5..3e8c842 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/common/HdfsServerConstants.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/common/HdfsServerConstants.java
@@ -72,6 +72,15 @@ public final class HdfsServerConstants {
       throw new IllegalArgumentException("Failed to convert \"" + s
           + "\" to " + RollingUpgradeStartupOption.class.getSimpleName());
     }
+
+    public static String getAllOptionString() {
+      final StringBuilder b = new StringBuilder("<");
+      for(RollingUpgradeStartupOption opt : VALUES) {
+        b.append(opt.name().toLowerCase()).append("|");
+      }
+      b.setCharAt(b.length() - 1, '>');
+      return b.toString();
+    }
   }
 
   /** Startup options */

http://git-wip-us.apache.org/repos/asf/hadoop/blob/f6d0b889/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNode.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNode.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNode.java
index 3f66301..4e61f05 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNode.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNode.java
@@ -216,10 +216,8 @@ public class NameNode implements NameNodeStatusMXBean {
         " [" + StartupOption.CLUSTERID.getName() + " cid]" +
         " [" + StartupOption.RENAMERESERVED.getName() + "<k-v pairs>] ] | \n\t["
       + StartupOption.ROLLBACK.getName() + "] | \n\t["
-      + StartupOption.ROLLINGUPGRADE.getName() + " <"
-      + RollingUpgradeStartupOption.DOWNGRADE.name().toLowerCase() + "|"
-      + RollingUpgradeStartupOption.ROLLBACK.name().toLowerCase() + "|"
-      + RollingUpgradeStartupOption.STARTED.name().toLowerCase() + "> ] | \n\t["
+      + StartupOption.ROLLINGUPGRADE.getName() + " "
+      + RollingUpgradeStartupOption.getAllOptionString() + " ] | \n\t["
       + StartupOption.FINALIZE.getName() + "] | \n\t["
       + StartupOption.IMPORT.getName() + "] | \n\t["
       + StartupOption.INITIALIZESHAREDEDITS.getName() + "] | \n\t["
@@ -1250,6 +1248,11 @@ public class NameNode implements NameNodeStatusMXBean {
       } else if (StartupOption.ROLLINGUPGRADE.getName().equalsIgnoreCase(cmd)) {
         startOpt = StartupOption.ROLLINGUPGRADE;
         ++i;
+        if (i >= argsLen) {
+          LOG.fatal("Must specify a rolling upgrade startup option "
+              + RollingUpgradeStartupOption.getAllOptionString());
+          return null;
+        }
         startOpt.setRollingUpgradeStartupOption(args[i]);
       } else if (StartupOption.ROLLBACK.getName().equalsIgnoreCase(cmd)) {
         startOpt = StartupOption.ROLLBACK;
@@ -1508,7 +1511,7 @@ public class NameNode implements NameNodeStatusMXBean {
         namenode.join();
       }
     } catch (Throwable e) {
-      LOG.fatal("Exception in namenode join", e);
+      LOG.fatal("Failed to start namenode.", e);
       terminate(1, e);
     }
   }

http://git-wip-us.apache.org/repos/asf/hadoop/blob/f6d0b889/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestHdfsServerConstants.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestHdfsServerConstants.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestHdfsServerConstants.java
index a147103..2e76b25 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestHdfsServerConstants.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestHdfsServerConstants.java
@@ -17,12 +17,12 @@
  */
 package org.apache.hadoop.hdfs.server.datanode;
 
-import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.*;
-import org.junit.Test;
-
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
-import static org.hamcrest.core.Is.is;
-import static org.junit.Assert.assertThat;
+
+import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.RollingUpgradeStartupOption;
+import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.StartupOption;
+import org.junit.Test;
 
 
 /**
@@ -43,10 +43,10 @@ public class TestHdfsServerConstants {
       RollingUpgradeStartupOption expectedRollupOption) {
 
     StartupOption option = StartupOption.getEnum(value);
-    assertThat(option, is(expectedOption));
+    assertEquals(expectedOption, option);
 
     if (expectedRollupOption != null) {
-      assertThat(option.getRollingUpgradeStartupOption(), is(expectedRollupOption));
+      assertEquals(expectedRollupOption, option.getRollingUpgradeStartupOption());
     }
   }
 
@@ -86,6 +86,9 @@ public class TestHdfsServerConstants {
     verifyStartupOptionResult("ROLLINGUPGRADE(DOWNGRADE)",
                               StartupOption.ROLLINGUPGRADE,
                               RollingUpgradeStartupOption.DOWNGRADE);
+    verifyStartupOptionResult("ROLLINGUPGRADE(STARTED)",
+        StartupOption.ROLLINGUPGRADE,
+        RollingUpgradeStartupOption.STARTED);
 
     try {
       verifyStartupOptionResult("ROLLINGUPGRADE(UNKNOWNOPTION)", StartupOption.ROLLINGUPGRADE, null);

http://git-wip-us.apache.org/repos/asf/hadoop/blob/f6d0b889/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNameNodeOptionParsing.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNameNodeOptionParsing.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNameNodeOptionParsing.java
index 6ef1e57..f540253 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNameNodeOptionParsing.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNameNodeOptionParsing.java
@@ -23,7 +23,9 @@ import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 import org.apache.hadoop.hdfs.protocol.HdfsConstants;
+import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.RollingUpgradeStartupOption;
 import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.StartupOption;
+import org.junit.Assert;
 import org.junit.Test;
 
 public class TestNameNodeOptionParsing {
@@ -102,4 +104,47 @@ public class TestNameNodeOptionParsing {
     assertNull(opt);
   }
 
+  @Test(timeout = 10000)
+  public void testRollingUpgrade() {
+    {
+      final String[] args = {"-rollingUpgrade"};
+      final StartupOption opt = NameNode.parseArguments(args);
+      assertNull(opt);
+    }
+
+    {
+      final String[] args = {"-rollingUpgrade", "started"};
+      final StartupOption opt = NameNode.parseArguments(args);
+      assertEquals(StartupOption.ROLLINGUPGRADE, opt);
+      assertEquals(RollingUpgradeStartupOption.STARTED, opt.getRollingUpgradeStartupOption());
+      assertTrue(RollingUpgradeStartupOption.STARTED.matches(opt));
+    }
+
+    {
+      final String[] args = {"-rollingUpgrade", "downgrade"};
+      final StartupOption opt = NameNode.parseArguments(args);
+      assertEquals(StartupOption.ROLLINGUPGRADE, opt);
+      assertEquals(RollingUpgradeStartupOption.DOWNGRADE, opt.getRollingUpgradeStartupOption());
+      assertTrue(RollingUpgradeStartupOption.DOWNGRADE.matches(opt));
+    }
+
+    {
+      final String[] args = {"-rollingUpgrade", "rollback"};
+      final StartupOption opt = NameNode.parseArguments(args);
+      assertEquals(StartupOption.ROLLINGUPGRADE, opt);
+      assertEquals(RollingUpgradeStartupOption.ROLLBACK, opt.getRollingUpgradeStartupOption());
+      assertTrue(RollingUpgradeStartupOption.ROLLBACK.matches(opt));
+    }
+
+    {
+      final String[] args = {"-rollingUpgrade", "foo"};
+      try {
+        NameNode.parseArguments(args);
+        Assert.fail();
+      } catch(IllegalArgumentException iae) {
+        // the exception is expected.
+      }
+    }
+  }
+    
 }