Explorar o código

HDFS-14711. RBF: RBFMetrics throws NullPointerException if stateStore disabled. Contributed by Chen Zhang.

Ayush Saxena %!s(int64=5) %!d(string=hai) anos
pai
achega
18d74fe41c

+ 24 - 1
hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/metrics/RBFMetrics.java

@@ -31,6 +31,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
@@ -183,6 +184,10 @@ public class RBFMetrics implements RouterMBean, FederationMBean {
   @Override
   public String getNamenodes() {
     final Map<String, Map<String, Object>> info = new LinkedHashMap<>();
+    if (membershipStore == null) {
+      return "{}";
+    }
+
     try {
       // Get the values from the store
       GetNamenodeRegistrationsRequest request =
@@ -252,6 +257,9 @@ public class RBFMetrics implements RouterMBean, FederationMBean {
   @Override
   public String getMountTable() {
     final List<Map<String, Object>> info = new LinkedList<>();
+    if (mountTableStore == null) {
+      return "[]";
+    }
 
     try {
       // Get all the mount points in order
@@ -302,6 +310,9 @@ public class RBFMetrics implements RouterMBean, FederationMBean {
   @Override
   public String getRouters() {
     final Map<String, Map<String, Object>> info = new LinkedHashMap<>();
+    if (routerStore == null) {
+      return "{}";
+    }
     try {
       // Get all the routers in order
       GetRouterRegistrationsRequest request =
@@ -391,6 +402,9 @@ public class RBFMetrics implements RouterMBean, FederationMBean {
 
   @Override
   public int getNumNamenodes() {
+    if (membershipStore == null) {
+      return 0;
+    }
     try {
       GetNamenodeRegistrationsRequest request =
           GetNamenodeRegistrationsRequest.newInstance();
@@ -406,6 +420,9 @@ public class RBFMetrics implements RouterMBean, FederationMBean {
 
   @Override
   public int getNumExpiredNamenodes() {
+    if (membershipStore == null) {
+      return 0;
+    }
     try {
       GetNamenodeRegistrationsRequest request =
           GetNamenodeRegistrationsRequest.newInstance();
@@ -670,6 +687,9 @@ public class RBFMetrics implements RouterMBean, FederationMBean {
    */
   private Collection<String> getNamespaceInfo(
       Function<FederationNamespaceInfo, String> f) throws IOException {
+    if (membershipStore == null) {
+      return new HashSet<>();
+    }
     GetNamespaceInfoRequest request = GetNamespaceInfoRequest.newInstance();
     GetNamespaceInfoResponse response =
         membershipStore.getNamespaceInfo(request);
@@ -719,8 +739,11 @@ public class RBFMetrics implements RouterMBean, FederationMBean {
    */
   private List<MembershipState> getActiveNamenodeRegistrations()
       throws IOException {
-
     List<MembershipState> resultList = new ArrayList<>();
+    if (membershipStore == null) {
+      return resultList;
+    }
+
     GetNamespaceInfoRequest request = GetNamespaceInfoRequest.newInstance();
     GetNamespaceInfoResponse response =
         membershipStore.getNamespaceInfo(request);

+ 22 - 0
hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestRouterRpc.java

@@ -101,6 +101,7 @@ import org.apache.hadoop.hdfs.server.federation.MiniRouterDFSCluster.RouterConte
 import org.apache.hadoop.hdfs.server.federation.MockResolver;
 import org.apache.hadoop.hdfs.server.federation.RouterConfigBuilder;
 import org.apache.hadoop.hdfs.server.federation.metrics.NamenodeBeanMetrics;
+import org.apache.hadoop.hdfs.server.federation.metrics.RBFMetrics;
 import org.apache.hadoop.hdfs.server.federation.resolver.FileSubclusterResolver;
 import org.apache.hadoop.hdfs.server.namenode.FSDirectory;
 import org.apache.hadoop.hdfs.server.namenode.FSNamesystem;
@@ -1618,6 +1619,27 @@ public class TestRouterRpc {
     cluster.waitNamenodeRegistration();
   }
 
+  @Test
+  public void testRBFMetricsMethodsRelayOnStateStore() {
+    assertNull(router.getRouter().getStateStore());
+
+    RBFMetrics metrics = router.getRouter().getMetrics();
+    assertEquals("{}", metrics.getNamenodes());
+    assertEquals("[]", metrics.getMountTable());
+    assertEquals("{}", metrics.getRouters());
+    assertEquals(0, metrics.getNumNamenodes());
+    assertEquals(0, metrics.getNumExpiredNamenodes());
+
+    // These 2 methods relays on {@link RBFMetrics#getNamespaceInfo()}
+    assertEquals("[]", metrics.getClusterId());
+    assertEquals("[]", metrics.getBlockPoolId());
+
+    // These methods relays on
+    // {@link RBFMetrics#getActiveNamenodeRegistration()}
+    assertEquals("{}", metrics.getNameservices());
+    assertEquals(0, metrics.getNumLiveNodes());
+  }
+
   @Test
   public void testCacheAdmin() throws Exception {
     DistributedFileSystem routerDFS = (DistributedFileSystem) routerFS;