From 30c4919ef2712fc5cd0cd0347e50c66b0593f709 Mon Sep 17 00:00:00 2001 From: YulongZ Date: Wed, 9 Feb 2022 00:40:57 +0800 Subject: [PATCH] HDFS-16411 RBF: RouterId is NULL when disable RourterRpcServer (#3878) --- .../hdfs/server/federation/router/Router.java | 17 ++++++++++++++++ .../server/federation/router/TestRouter.java | 20 +++++++++++++------ 2 files changed, 31 insertions(+), 6 deletions(-) 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 dbfed250156a79..6d52bc26cdf639 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 @@ -196,6 +196,8 @@ protected void serviceInit(Configuration configuration) throws Exception { this.setRpcServerAddress(rpcServer.getRpcAddress()); } + checkRouterId(); + if (conf.getBoolean( RBFConfigKeys.DFS_ROUTER_ADMIN_ENABLE, RBFConfigKeys.DFS_ROUTER_ADMIN_ENABLE_DEFAULT)) { @@ -308,6 +310,21 @@ protected void serviceInit(Configuration configuration) throws Exception { } } + /** + * Set the router id if not set to prevent RouterHeartbeatService + * update state store with a null router id. + */ + private void checkRouterId() { + if (this.routerId == null) { + InetSocketAddress confRpcAddress = conf.getSocketAddr( + RBFConfigKeys.DFS_ROUTER_RPC_BIND_HOST_KEY, + RBFConfigKeys.DFS_ROUTER_RPC_ADDRESS_KEY, + RBFConfigKeys.DFS_ROUTER_RPC_ADDRESS_DEFAULT, + RBFConfigKeys.DFS_ROUTER_RPC_PORT_DEFAULT); + setRpcServerAddress(confRpcAddress); + } + } + private String getDisabledDependentServices() { if (this.stateStore == null && this.adminServer == null) { return StateStoreService.class.getSimpleName() + "," diff --git a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestRouter.java b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestRouter.java index 44c0fc7ed30958..0464877d3cd80b 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestRouter.java +++ b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestRouter.java @@ -223,10 +223,14 @@ public void testRouterMetricsWhenDisabled() throws Exception { @Test public void testSwitchRouter() throws IOException { - assertRouterHeartbeater(true, true); - assertRouterHeartbeater(true, false); - assertRouterHeartbeater(false, true); - assertRouterHeartbeater(false, false); + assertRouterHeartbeater(true, true, true); + assertRouterHeartbeater(true, true, false); + assertRouterHeartbeater(true, false, true); + assertRouterHeartbeater(true, false, false); + assertRouterHeartbeater(false, true, true); + assertRouterHeartbeater(false, true, false); + assertRouterHeartbeater(false, false, true); + assertRouterHeartbeater(false, false, false); } /** @@ -235,15 +239,19 @@ public void testSwitchRouter() throws IOException { * @param expectedRouterHeartbeat expect the routerHeartbeat enable state. * @param expectedNNHeartbeat expect the nnHeartbeat enable state. */ - private void assertRouterHeartbeater(boolean expectedRouterHeartbeat, + private void assertRouterHeartbeater(boolean enableRpcServer, boolean expectedRouterHeartbeat, boolean expectedNNHeartbeat) throws IOException { final Router router = new Router(); - Configuration baseCfg = new RouterConfigBuilder(conf).rpc().build(); + Configuration baseCfg = new RouterConfigBuilder(conf).rpc(enableRpcServer).build(); baseCfg.setBoolean(RBFConfigKeys.DFS_ROUTER_HEARTBEAT_ENABLE, expectedRouterHeartbeat); baseCfg.setBoolean(RBFConfigKeys.DFS_ROUTER_NAMENODE_HEARTBEAT_ENABLE, expectedNNHeartbeat); router.init(baseCfg); + + // RouterId can not be null , used by RouterHeartbeatService.updateStateStore() + assertNotNull(router.getRouterId()); + RouterHeartbeatService routerHeartbeatService = router.getRouterHeartbeatService(); if (expectedRouterHeartbeat) {