From 3bb57522765ffbabe5564746d7c37bc59f96aa1e Mon Sep 17 00:00:00 2001 From: Surendra Singh Lilhore Date: Thu, 10 Jan 2019 16:18:23 +0530 Subject: [PATCH] HDFS-14191. RBF: Remove hard coded router status from FederationMetrics. Contributed by Ranith Sardar. --- .../federation/metrics/FederationMetrics.java | 2 +- .../metrics/NamenodeBeanMetrics.java | 25 +++++++++++++- .../hdfs/server/federation/router/Router.java | 7 ++++ .../main/webapps/router/federationhealth.js | 2 +- .../federation/router/TestRouterAdminCLI.java | 33 ++++++++++++++++++- 5 files changed, 65 insertions(+), 4 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/metrics/FederationMetrics.java b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/metrics/FederationMetrics.java index b3fe6cc9e20..c66910cf97d 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/metrics/FederationMetrics.java +++ b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/metrics/FederationMetrics.java @@ -582,7 +582,7 @@ public String getBlockPoolId() { @Override public String getRouterStatus() { - return "RUNNING"; + return this.router.getRouterState().toString(); } /** diff --git a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/metrics/NamenodeBeanMetrics.java b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/metrics/NamenodeBeanMetrics.java index 1b97b1aa9c8..b08d9608c01 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/metrics/NamenodeBeanMetrics.java +++ b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/metrics/NamenodeBeanMetrics.java @@ -45,6 +45,7 @@ import org.apache.hadoop.hdfs.server.federation.router.RBFConfigKeys; import org.apache.hadoop.hdfs.server.federation.router.Router; import org.apache.hadoop.hdfs.server.federation.router.RouterRpcServer; +import org.apache.hadoop.hdfs.server.federation.router.RouterServiceState; import org.apache.hadoop.hdfs.server.federation.router.SubClusterTimeoutException; import org.apache.hadoop.hdfs.server.federation.store.MembershipStore; import org.apache.hadoop.hdfs.server.federation.store.StateStoreService; @@ -232,7 +233,29 @@ public long getProvidedCapacity() { @Override public String getSafemode() { - // We assume that the global federated view is never in safe mode + try { + if (!getRouter().isRouterState(RouterServiceState.SAFEMODE)) { + return "Safe mode is ON. " + this.getSafeModeTip(); + } + } catch (IOException e) { + return "Failed to get safemode status. Please check router" + + "log for more detail."; + } + return ""; + } + + private String getSafeModeTip() throws IOException { + Router rt = getRouter(); + String cmd = "Use \"hdfs dfsrouteradmin -safemode leave\" " + + "to turn safe mode off."; + if (rt.isRouterState(RouterServiceState.INITIALIZING) + || rt.isRouterState(RouterServiceState.UNINITIALIZED)) { + return "Router is in" + rt.getRouterState() + + "mode, the router will immediately return to " + + "normal mode after some time. " + cmd; + } else if (rt.isRouterState(RouterServiceState.SAFEMODE)) { + return "It was turned on manually. " + cmd; + } return ""; } diff --git a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/router/Router.java b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/router/Router.java index 6a7437f29b5..0257162d139 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/router/Router.java +++ b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/router/Router.java @@ -585,6 +585,13 @@ public RouterServiceState getRouterState() { return this.state; } + /** + * Compare router state. + */ + public boolean isRouterState(RouterServiceState routerState) { + return routerState.equals(this.state); + } + ///////////////////////////////////////////////////////// // Submodule getters ///////////////////////////////////////////////////////// diff --git a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/webapps/router/federationhealth.js b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/webapps/router/federationhealth.js index bb8e05707e4..5da7b079ffe 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/webapps/router/federationhealth.js +++ b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/webapps/router/federationhealth.js @@ -35,7 +35,7 @@ var BEANS = [ {"name": "federation", "url": "/jmx?qry=Hadoop:service=Router,name=FederationState"}, {"name": "routerstat", "url": "/jmx?qry=Hadoop:service=NameNode,name=NameNodeStatus"}, - {"name": "router", "url": "/jmx?qrt=Hadoop:service=NameNode,name=NameNodeInfo"}, + {"name": "router", "url": "/jmx?qry=Hadoop:service=NameNode,name=NameNodeInfo"}, {"name": "mem", "url": "/jmx?qry=java.lang:type=Memory"} ]; diff --git a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestRouterAdminCLI.java b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestRouterAdminCLI.java index 445022bbce9..ab733dde8df 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestRouterAdminCLI.java +++ b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestRouterAdminCLI.java @@ -33,6 +33,7 @@ import org.apache.hadoop.hdfs.server.federation.MiniRouterDFSCluster.RouterContext; import org.apache.hadoop.hdfs.server.federation.RouterConfigBuilder; import org.apache.hadoop.hdfs.server.federation.StateStoreDFSCluster; +import org.apache.hadoop.hdfs.server.federation.metrics.FederationMetrics; import org.apache.hadoop.hdfs.server.federation.resolver.ActiveNamenodeResolver; import org.apache.hadoop.hdfs.server.federation.resolver.MountTableManager; import org.apache.hadoop.hdfs.server.federation.resolver.RemoteLocation; @@ -66,6 +67,7 @@ public class TestRouterAdminCLI { private static RouterAdmin admin; private static RouterClient client; + private static Router router; private static final String TEST_USER = "test-user"; @@ -80,6 +82,7 @@ public static void globalSetUp() throws Exception { // Build and start a router with State Store + admin + RPC Configuration conf = new RouterConfigBuilder() .stateStore() + .metrics() .admin() .rpc() .safemode() @@ -90,7 +93,7 @@ public static void globalSetUp() throws Exception { cluster.startRouters(); routerContext = cluster.getRandomRouter(); - Router router = routerContext.getRouter(); + router = routerContext.getRouter(); stateStore = router.getStateStore(); Configuration routerConf = new Configuration(); @@ -720,6 +723,34 @@ public void testManageSafeMode() throws Exception { err.reset(); } + @Test + public void testSafeModeStatus() throws Exception { + // ensure the Router become RUNNING state + waitState(RouterServiceState.RUNNING); + assertFalse(routerContext.getRouter().getSafemodeService().isInSafeMode()); + assertEquals(0, + ToolRunner.run(admin, new String[] {"-safemode", "enter" })); + + FederationMetrics metrics = router.getMetrics(); + String jsonString = metrics.getRouterStatus(); + + // verify state using FederationMetrics + assertEquals(RouterServiceState.SAFEMODE.toString(), jsonString); + assertTrue(routerContext.getRouter().getSafemodeService().isInSafeMode()); + + System.setOut(new PrintStream(out)); + assertEquals(0, + ToolRunner.run(admin, new String[] {"-safemode", "leave" })); + jsonString = metrics.getRouterStatus(); + // verify state + assertEquals(RouterServiceState.RUNNING.toString(), jsonString); + assertFalse(routerContext.getRouter().getSafemodeService().isInSafeMode()); + + out.reset(); + assertEquals(0, ToolRunner.run(admin, new String[] {"-safemode", "get" })); + assertTrue(out.toString().contains("false")); + } + @Test public void testCreateInvalidEntry() throws Exception { String[] argv = new String[] {