From 18d74fe41c0982dc1540367805b0c3d0d4fc29d3 Mon Sep 17 00:00:00 2001 From: Ayush Saxena Date: Sun, 1 Sep 2019 12:41:17 +0530 Subject: [PATCH] HDFS-14711. RBF: RBFMetrics throws NullPointerException if stateStore disabled. Contributed by Chen Zhang. --- .../server/federation/metrics/RBFMetrics.java | 25 ++++++++++++++++++- .../federation/router/TestRouterRpc.java | 22 ++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/metrics/RBFMetrics.java b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/metrics/RBFMetrics.java index 4b33f8000f0..86599c7fbe1 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/metrics/RBFMetrics.java +++ b/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> 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> 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> 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 getNamespaceInfo( Function 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 getActiveNamenodeRegistrations() throws IOException { - List resultList = new ArrayList<>(); + if (membershipStore == null) { + return resultList; + } + GetNamespaceInfoRequest request = GetNamespaceInfoRequest.newInstance(); GetNamespaceInfoResponse response = membershipStore.getNamespaceInfo(request); diff --git a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestRouterRpc.java b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestRouterRpc.java index 8ec87cb05f0..3767d93d9c4 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestRouterRpc.java +++ b/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;