Author: eli
Date: Sat Feb 4 20:12:51 2012
New Revision: 1240600
URL: http://svn.apache.org/viewvc?rev=1240600&view=rev
Log:
HDFS-2808. HA: haadmin should use namenode ids. Contributed by Eli Collins
Modified:
hadoop/common/branches/HDFS-1623/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/HAAdmin.java
hadoop/common/branches/HDFS-1623/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/NodeFencer.java
hadoop/common/branches/HDFS-1623/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestHAAdmin.java
Modified:
hadoop/common/branches/HDFS-1623/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/HAAdmin.java
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/HDFS-1623/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/HAAdmin.java?rev=1240600&r1=1240599&r2=1240600&view=diff
==============================================================================
---
hadoop/common/branches/HDFS-1623/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/HAAdmin.java
(original)
+++
hadoop/common/branches/HDFS-1623/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/HAAdmin.java
Sat Feb 4 20:12:51 2012
@@ -40,7 +40,7 @@ import com.google.common.collect.Immutab
/**
* A command-line tool for making calls in the HAServiceProtocol.
- * For example,. this can be used to force a daemon to standby or active
+ * For example,. this can be used to force a service to standby or active
* mode, or to trigger a health-check.
*/
@InterfaceAudience.Private
@@ -53,20 +53,20 @@ public abstract class HAAdmin extends Co
private static Map<String, UsageInfo> USAGE =
ImmutableMap.<String, UsageInfo>builder()
.put("-transitionToActive",
- new UsageInfo("<host:port>", "Transitions the daemon into Active
state"))
+ new UsageInfo("<serviceId>", "Transitions the service into Active
state"))
.put("-transitionToStandby",
- new UsageInfo("<host:port>", "Transitions the daemon into Standby
state"))
+ new UsageInfo("<serviceId>", "Transitions the service into Standby
state"))
.put("-failover",
- new UsageInfo("[--"+FORCEFENCE+"] [--"+FORCEACTIVE+"] <host:port>
<host:port>",
- "Failover from the first daemon to the second.\n" +
+ new UsageInfo("[--"+FORCEFENCE+"] [--"+FORCEACTIVE+"] <serviceId>
<serviceId>",
+ "Failover from the first service to the second.\n" +
"Unconditionally fence services if the "+FORCEFENCE+" option is
used.\n" +
"Try to failover to the target service even if it is not ready if
the " +
FORCEACTIVE + " option is used."))
.put("-getServiceState",
- new UsageInfo("<host:port>", "Returns the state of the daemon"))
+ new UsageInfo("<serviceId>", "Returns the state of the service"))
.put("-checkHealth",
- new UsageInfo("<host:port>",
- "Requests that the daemon perform a health check.\n" +
+ new UsageInfo("<serviceId>",
+ "Requests that the service perform a health check.\n" +
"The HAAdmin tool will exit with a non-zero exit code\n" +
"if the check fails."))
.put("-help",
@@ -74,11 +74,15 @@ public abstract class HAAdmin extends Co
.build();
/** Output stream for errors, for use in tests */
- PrintStream errOut = System.err;
+ protected PrintStream errOut = System.err;
PrintStream out = System.out;
- private static void printUsage(PrintStream errOut) {
- errOut.println("Usage: java HAAdmin");
+ protected String getUsageString() {
+ return "Usage: HAAdmin";
+ }
+
+ protected void printUsage(PrintStream errOut) {
+ errOut.println(getUsageString());
for (Map.Entry<String, UsageInfo> e : USAGE.entrySet()) {
String cmd = e.getKey();
UsageInfo usage = e.getValue();
@@ -94,7 +98,7 @@ public abstract class HAAdmin extends Co
if (usage == null) {
throw new RuntimeException("No usage for cmd " + cmd);
}
- errOut.println("Usage: java HAAdmin [" + cmd + " " + usage.args + "]");
+ errOut.println("Usage: HAAdmin [" + cmd + " " + usage.args + "]");
}
private int transitionToActive(final String[] argv)
@@ -171,8 +175,10 @@ public abstract class HAAdmin extends Co
return -1;
}
- InetSocketAddress addr1 = NetUtils.createSocketAddr(args[0]);
- InetSocketAddress addr2 = NetUtils.createSocketAddr(args[1]);
+ InetSocketAddress addr1 =
+ NetUtils.createSocketAddr(getServiceAddr(args[0]));
+ InetSocketAddress addr2 =
+ NetUtils.createSocketAddr(getServiceAddr(args[1]));
HAServiceProtocol proto1 = getProtocol(args[0]);
HAServiceProtocol proto2 = getProtocol(args[1]);
@@ -219,11 +225,20 @@ public abstract class HAAdmin extends Co
}
/**
- * Return a proxy to the specified target host:port.
+ * Return the serviceId as is, we are assuming it was
+ * given as a service address of form <host:ipcport>.
*/
- protected HAServiceProtocol getProtocol(String target)
+ protected String getServiceAddr(String serviceId) {
+ return serviceId;
+ }
+
+ /**
+ * Return a proxy to the specified target service.
+ */
+ protected HAServiceProtocol getProtocol(String serviceId)
throws IOException {
- InetSocketAddress addr = NetUtils.createSocketAddr(target);
+ String serviceAddr = getServiceAddr(serviceId);
+ InetSocketAddress addr = NetUtils.createSocketAddr(serviceAddr);
return (HAServiceProtocol)RPC.getProxy(
HAServiceProtocol.class, HAServiceProtocol.versionID,
addr, getConf());
@@ -231,6 +246,15 @@ public abstract class HAAdmin extends Co
@Override
public int run(String[] argv) throws Exception {
+ try {
+ return runCmd(argv);
+ } catch (IllegalArgumentException iae) {
+ errOut.println("Illegal argument: " + iae.getMessage());
+ return -1;
+ }
+ }
+
+ protected int runCmd(String[] argv) throws Exception {
if (argv.length < 1) {
printUsage(errOut);
return -1;
@@ -244,7 +268,7 @@ public abstract class HAAdmin extends Co
printUsage(errOut);
return -1;
}
-
+
if ("-transitionToActive".equals(cmd)) {
return transitionToActive(argv);
} else if ("-transitionToStandby".equals(cmd)) {
Modified:
hadoop/common/branches/HDFS-1623/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/NodeFencer.java
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/HDFS-1623/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/NodeFencer.java?rev=1240600&r1=1240599&r2=1240600&view=diff
==============================================================================
---
hadoop/common/branches/HDFS-1623/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/NodeFencer.java
(original)
+++
hadoop/common/branches/HDFS-1623/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/NodeFencer.java
Sat Feb 4 20:12:51 2012
@@ -54,7 +54,7 @@ import com.google.common.collect.Lists;
@InterfaceAudience.Private
@InterfaceStability.Evolving
public class NodeFencer {
- static final String CONF_METHODS_KEY =
+ public static final String CONF_METHODS_KEY =
"dfs.namenode.ha.fencing.methods";
private static final String CLASS_RE = "([a-zA-Z0-9\\.\\$]+)";
Modified:
hadoop/common/branches/HDFS-1623/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestHAAdmin.java
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/HDFS-1623/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestHAAdmin.java?rev=1240600&r1=1240599&r2=1240600&view=diff
==============================================================================
---
hadoop/common/branches/HDFS-1623/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestHAAdmin.java
(original)
+++
hadoop/common/branches/HDFS-1623/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestHAAdmin.java
Sat Feb 4 20:12:51 2012
@@ -26,7 +26,6 @@ import java.io.PrintStream;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.logging.Log;
import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.ha.HAServiceProtocol.HAServiceState;
import org.junit.Before;
import org.junit.Test;
@@ -88,107 +87,12 @@ public class TestHAAdmin {
assertEquals(-1, runTool("-failover", "foo:1234"));
assertOutputContains("failover: incorrect arguments");
}
-
+
@Test
public void testHelp() throws Exception {
assertEquals(-1, runTool("-help"));
assertEquals(0, runTool("-help", "transitionToActive"));
- assertOutputContains("Transitions the daemon into Active");
- }
-
- @Test
- public void testTransitionToActive() throws Exception {
- assertEquals(0, runTool("-transitionToActive", "foo:1234"));
- Mockito.verify(mockProtocol).transitionToActive();
- }
-
- @Test
- public void testTransitionToStandby() throws Exception {
- assertEquals(0, runTool("-transitionToStandby", "foo:1234"));
- Mockito.verify(mockProtocol).transitionToStandby();
- }
-
- @Test
- public void testFailoverWithNoFencerConfigured() throws Exception {
-
Mockito.doReturn(HAServiceState.STANDBY).when(mockProtocol).getServiceState();
- assertEquals(-1, runTool("-failover", "foo:1234", "bar:5678"));
- }
-
- @Test
- public void testFailoverWithFencerConfigured() throws Exception {
-
Mockito.doReturn(HAServiceState.STANDBY).when(mockProtocol).getServiceState();
- Configuration conf = new Configuration();
- conf.set(NodeFencer.CONF_METHODS_KEY, "shell(true)");
- tool.setConf(conf);
- assertEquals(0, runTool("-failover", "foo:1234", "bar:5678"));
- }
-
- @Test
- public void testFailoverWithFencerConfiguredAndForce() throws Exception {
-
Mockito.doReturn(HAServiceState.STANDBY).when(mockProtocol).getServiceState();
- Configuration conf = new Configuration();
- conf.set(NodeFencer.CONF_METHODS_KEY, "shell(true)");
- tool.setConf(conf);
- assertEquals(0, runTool("-failover", "foo:1234", "bar:5678",
"--forcefence"));
- }
-
- @Test
- public void testFailoverWithForceActive() throws Exception {
-
Mockito.doReturn(HAServiceState.STANDBY).when(mockProtocol).getServiceState();
- Configuration conf = new Configuration();
- conf.set(NodeFencer.CONF_METHODS_KEY, "shell(true)");
- tool.setConf(conf);
- assertEquals(0, runTool("-failover", "foo:1234", "bar:5678",
"--forceactive"));
- }
-
- @Test
- public void testFailoverWithInvalidFenceArg() throws Exception {
-
Mockito.doReturn(HAServiceState.STANDBY).when(mockProtocol).getServiceState();
- Configuration conf = new Configuration();
- conf.set(NodeFencer.CONF_METHODS_KEY, "shell(true)");
- tool.setConf(conf);
- assertEquals(-1, runTool("-failover", "foo:1234", "bar:5678",
"notforcefence"));
- }
-
- @Test
- public void testFailoverWithFenceButNoFencer() throws Exception {
-
Mockito.doReturn(HAServiceState.STANDBY).when(mockProtocol).getServiceState();
- assertEquals(-1, runTool("-failover", "foo:1234", "bar:5678",
"--forcefence"));
- }
-
- @Test
- public void testFailoverWithFenceAndBadFencer() throws Exception {
-
Mockito.doReturn(HAServiceState.STANDBY).when(mockProtocol).getServiceState();
- Configuration conf = new Configuration();
- conf.set(NodeFencer.CONF_METHODS_KEY, "foobar!");
- tool.setConf(conf);
- assertEquals(-1, runTool("-failover", "foo:1234", "bar:5678",
"--forcefence"));
- }
-
- @Test
- public void testForceFenceOptionListedBeforeArgs() throws Exception {
-
Mockito.doReturn(HAServiceState.STANDBY).when(mockProtocol).getServiceState();
- Configuration conf = new Configuration();
- conf.set(NodeFencer.CONF_METHODS_KEY, "shell(true)");
- tool.setConf(conf);
- assertEquals(0, runTool("-failover", "--forcefence", "foo:1234",
"bar:5678"));
- }
-
- @Test
- public void testGetServiceState() throws Exception {
- assertEquals(0, runTool("-getServiceState", "foo:1234"));
- Mockito.verify(mockProtocol).getServiceState();
- }
-
- @Test
- public void testCheckHealth() throws Exception {
- assertEquals(0, runTool("-checkHealth", "foo:1234"));
- Mockito.verify(mockProtocol).monitorHealth();
-
- Mockito.doThrow(new HealthCheckFailedException("fake health check
failure"))
- .when(mockProtocol).monitorHealth();
- assertEquals(-1, runTool("-checkHealth", "foo:1234"));
- assertOutputContains("Health check failed: fake health check failure");
+ assertOutputContains("Transitions the service into Active");
}
private Object runTool(String ... args) throws Exception {
@@ -199,5 +103,4 @@ public class TestHAAdmin {
LOG.info("Output:\n" + errOutput);
return ret;
}
-
}