This is an automated email from the ASF dual-hosted git repository.

ayushsaxena pushed a commit to branch HDFS-13891
in repository https://gitbox.apache.org/repos/asf/hadoop.git


The following commit(s) were added to refs/heads/HDFS-13891 by this push:
     new 0bcbdd6  HDFS-13480. RBF: Separate namenodeHeartbeat and 
routerHeartbeat to different config key. Contributed by Ayush Saxena.
0bcbdd6 is described below

commit 0bcbdd6dfc80722f17f83e11f0f4f140c3f552d6
Author: Ayush Saxena <[email protected]>
AuthorDate: Sat Jun 1 10:00:02 2019 +0530

    HDFS-13480. RBF: Separate namenodeHeartbeat and routerHeartbeat to 
different config key. Contributed by Ayush Saxena.
---
 .../server/federation/router/RBFConfigKeys.java    |  2 +
 .../hdfs/server/federation/router/Router.java      | 19 ++++++++--
 .../src/main/resources/hdfs-rbf-default.xml        | 10 +++++
 .../src/site/markdown/HDFSRouterFederation.md      |  7 +++-
 .../hdfs/server/federation/router/TestRouter.java  | 43 ++++++++++++++++++++++
 5 files changed, 77 insertions(+), 4 deletions(-)

diff --git 
a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/router/RBFConfigKeys.java
 
b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/router/RBFConfigKeys.java
index 6f9c888..1daebdc 100644
--- 
a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/router/RBFConfigKeys.java
+++ 
b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/router/RBFConfigKeys.java
@@ -91,6 +91,8 @@ public class RBFConfigKeys extends 
CommonConfigurationKeysPublic {
   public static final String DFS_ROUTER_HEARTBEAT_ENABLE =
       FEDERATION_ROUTER_PREFIX + "heartbeat.enable";
   public static final boolean DFS_ROUTER_HEARTBEAT_ENABLE_DEFAULT = true;
+  public static final String DFS_ROUTER_NAMENODE_HEARTBEAT_ENABLE =
+      FEDERATION_ROUTER_PREFIX + "namenode.heartbeat.enable";
   public static final String DFS_ROUTER_HEARTBEAT_INTERVAL_MS =
       FEDERATION_ROUTER_PREFIX + "heartbeat.interval";
   public static final long DFS_ROUTER_HEARTBEAT_INTERVAL_MS_DEFAULT =
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 7f9c597..539c6c8 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
@@ -205,9 +205,13 @@ public class Router extends CompositeService implements
       addService(this.httpServer);
     }
 
-    if (conf.getBoolean(
+    boolean isRouterHeartbeatEnabled = conf.getBoolean(
         RBFConfigKeys.DFS_ROUTER_HEARTBEAT_ENABLE,
-        RBFConfigKeys.DFS_ROUTER_HEARTBEAT_ENABLE_DEFAULT)) {
+        RBFConfigKeys.DFS_ROUTER_HEARTBEAT_ENABLE_DEFAULT);
+    boolean isNamenodeHeartbeatEnable = conf.getBoolean(
+        RBFConfigKeys.DFS_ROUTER_NAMENODE_HEARTBEAT_ENABLE,
+        isRouterHeartbeatEnabled);
+    if (isNamenodeHeartbeatEnable) {
 
       // Create status updater for each monitored Namenode
       this.namenodeHeartbeatServices = createNamenodeHeartbeatServices();
@@ -219,7 +223,8 @@ public class Router extends CompositeService implements
       if (this.namenodeHeartbeatServices.isEmpty()) {
         LOG.error("Heartbeat is enabled but there are no namenodes to 
monitor");
       }
-
+    }
+    if (isRouterHeartbeatEnabled) {
       // Periodically update the router state
       this.routerHeartbeatService = new RouterHeartbeatService(this);
       addService(this.routerHeartbeatService);
@@ -751,6 +756,14 @@ public class Router extends CompositeService implements
   }
 
   /**
+   * Get this router heartbeat service.
+   */
+  @VisibleForTesting
+  RouterHeartbeatService getRouterHeartbeatService() {
+    return this.routerHeartbeatService;
+  }
+
+  /**
    * Get the Router safe mode service.
    */
   RouterSafemodeService getSafemodeService() {
diff --git 
a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/resources/hdfs-rbf-default.xml 
b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/resources/hdfs-rbf-default.xml
index 641d273..3f743f9 100644
--- 
a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/resources/hdfs-rbf-default.xml
+++ 
b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/resources/hdfs-rbf-default.xml
@@ -372,6 +372,16 @@
   </property>
 
   <property>
+    <name>dfs.federation.router.namenode.heartbeat.enable</name>
+    <value>true</value>
+    <description>
+      If true, get namenode heartbeats and send into the State Store.
+      If not explicitly specified takes the same value as for
+       dfs.federation.router.heartbeat.enable.
+    </description>
+  </property>
+
+  <property>
     <name>dfs.federation.router.store.router.expiration</name>
     <value>5m</value>
     <description>
diff --git 
a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/site/markdown/HDFSRouterFederation.md 
b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/site/markdown/HDFSRouterFederation.md
index d4f10a1..5e107d2 100644
--- 
a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/site/markdown/HDFSRouterFederation.md
+++ 
b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/site/markdown/HDFSRouterFederation.md
@@ -45,6 +45,7 @@ This approach has the same architecture as [YARN 
federation](../../hadoop-yarn/h
 
 ### Example flow
 The simplest configuration deploys a Router on each NameNode machine.
+The Router monitors the local NameNode and its state and heartbeats to the 
State Store.
 The Router monitors the local NameNode and heartbeats the state to the State 
Store.
 When a regular DFS client contacts any of the Routers to access a file in the 
federated filesystem, the Router checks the Mount Table in the State Store 
(i.e., the local cache) to find out which subcluster contains the file.
 Then it checks the Membership table in the State Store (i.e., the local cache) 
for the NameNode responsible for the subcluster.
@@ -69,6 +70,9 @@ To make sure that changes have been propagated to all 
Routers, each Router heart
 The communications between the Routers and the State Store are cached (with 
timed expiration for freshness).
 This improves the performance of the system.
 
+#### Router heartbeat
+The Router periodically heartbeats its state to the State Store.
+
 #### NameNode heartbeat
 For this role, the Router periodically checks the state of a NameNode (usually 
on the same server) and reports their high availability (HA) state and 
load/space status to the State Store.
 Note that this is an optional role, as a Router can be independent of any 
subcluster.
@@ -433,7 +437,8 @@ Monitor the namenodes in the subclusters for forwarding the 
client requests.
 
 | Property | Default | Description|
 |:---- |:---- |:---- |
-| dfs.federation.router.heartbeat.enable | `true` | If `true`, the Router 
heartbeats into the State Store. |
+| dfs.federation.router.heartbeat.enable | `true` | If `true`, the Router 
periodically heartbeats its state to the State Store. |
+| dfs.federation.router.namenode.heartbeat.enable | | If `true`, the Router 
gets namenode heartbeats and send to the State Store. If not explicitly 
specified takes the same value as for `dfs.federation.router.heartbeat.enable`. 
|
 | dfs.federation.router.heartbeat.interval | 5000 | How often the Router 
should heartbeat into the State Store in milliseconds. |
 | dfs.federation.router.monitor.namenode | | The identifier of the namenodes 
to monitor and heartbeat. |
 | dfs.federation.router.monitor.localnamenode.enable | `true` | If `true`, the 
Router should monitor the namenode in the local machine. |
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 f83cfda..5fdb2cb 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
@@ -21,11 +21,13 @@ import static 
org.apache.hadoop.test.GenericTestUtils.assertExceptionContains;
 import static org.apache.hadoop.test.LambdaTestUtils.intercept;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.fail;
 import static org.mockito.Mockito.mock;
 
 import java.io.IOException;
 import java.net.InetSocketAddress;
+import java.util.Collection;
 
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.CommonConfigurationKeys;
@@ -217,4 +219,45 @@ public class TestRouter {
     router.stop();
     router.close();
   }
+
+  @Test
+  public void testSwitchRouter() throws IOException {
+    assertRouterHeartbeater(true, true);
+    assertRouterHeartbeater(true, false);
+    assertRouterHeartbeater(false, true);
+    assertRouterHeartbeater(false, false);
+  }
+
+  /**
+   * Execute the test by specify the routerHeartbeat and nnHeartbeat switch.
+   *
+   * @param expectedRouterHeartbeat expect the routerHeartbeat enable state.
+   * @param expectedNNHeartbeat expect the nnHeartbeat enable state.
+   */
+  private void assertRouterHeartbeater(boolean expectedRouterHeartbeat,
+      boolean expectedNNHeartbeat) throws IOException {
+    final Router router = new Router();
+    Configuration baseCfg = new RouterConfigBuilder(conf).rpc().build();
+    baseCfg.setBoolean(RBFConfigKeys.DFS_ROUTER_HEARTBEAT_ENABLE,
+        expectedRouterHeartbeat);
+    baseCfg.setBoolean(RBFConfigKeys.DFS_ROUTER_NAMENODE_HEARTBEAT_ENABLE,
+        expectedNNHeartbeat);
+    router.init(baseCfg);
+    RouterHeartbeatService routerHeartbeatService =
+        router.getRouterHeartbeatService();
+    if (expectedRouterHeartbeat) {
+      assertNotNull(routerHeartbeatService);
+    } else {
+      assertNull(routerHeartbeatService);
+    }
+    Collection<NamenodeHeartbeatService> namenodeHeartbeatServices =
+        router.getNamenodeHeartbeatServices();
+    if (expectedNNHeartbeat) {
+      assertNotNull(namenodeHeartbeatServices);
+    } else {
+      assertNull(namenodeHeartbeatServices);
+    }
+    router.close();
+  }
+
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to