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

This commit is contained in:
Ayush Saxena 2019-09-01 12:41:17 +05:30
parent fef65b4c2b
commit 18d74fe41c
2 changed files with 46 additions and 1 deletions

View File

@ -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);

View File

@ -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;