HDFS-13721. NPE in DataNode due to uninitialized DiskBalancer.

This commit is contained in:
Xiao Chen 2018-07-06 20:45:27 -07:00 committed by Arpit Agarwal
parent ba6b48e19f
commit 7d1e2e1fbb
2 changed files with 18 additions and 6 deletions

View File

@ -3135,7 +3135,7 @@ public class DataNode extends ReconfigurableBase
@Override // DataNodeMXBean
public String getDiskBalancerStatus() {
try {
return this.diskBalancer.queryWorkStatus().toJsonString();
return getDiskBalancer().queryWorkStatus().toJsonString();
} catch (IOException ex) {
LOG.debug("Reading diskbalancer Status failed. ex:{}", ex);
return "";
@ -3513,7 +3513,7 @@ public class DataNode extends ReconfigurableBase
DiskBalancerException.Result.DATANODE_STATUS_NOT_REGULAR);
}
this.diskBalancer.submitPlan(planID, planVersion, planFile, planData,
getDiskBalancer().submitPlan(planID, planVersion, planFile, planData,
skipDateCheck);
}
@ -3525,7 +3525,7 @@ public class DataNode extends ReconfigurableBase
public void cancelDiskBalancePlan(String planID) throws
IOException {
checkSuperuserPrivilege();
this.diskBalancer.cancelPlan(planID);
getDiskBalancer().cancelPlan(planID);
}
/**
@ -3536,7 +3536,7 @@ public class DataNode extends ReconfigurableBase
@Override
public DiskBalancerWorkStatus queryDiskBalancerPlan() throws IOException {
checkSuperuserPrivilege();
return this.diskBalancer.queryWorkStatus();
return getDiskBalancer().queryWorkStatus();
}
/**
@ -3553,9 +3553,9 @@ public class DataNode extends ReconfigurableBase
Preconditions.checkNotNull(key);
switch (key) {
case DiskBalancerConstants.DISKBALANCER_VOLUME_NAME:
return this.diskBalancer.getVolumeNames();
return getDiskBalancer().getVolumeNames();
case DiskBalancerConstants.DISKBALANCER_BANDWIDTH :
return Long.toString(this.diskBalancer.getBandwidth());
return Long.toString(getDiskBalancer().getBandwidth());
default:
LOG.error("Disk Balancer - Unknown key in get balancer setting. Key: {}",
key);
@ -3609,4 +3609,11 @@ public class DataNode extends ReconfigurableBase
}
return volumeInfoList;
}
private DiskBalancer getDiskBalancer() throws IOException {
if (this.diskBalancer == null) {
throw new IOException("DiskBalancer is not initialized");
}
return this.diskBalancer;
}
}

View File

@ -109,6 +109,11 @@ public class TestDiskBalancer {
.getFsVolumeReferences()) {
assertEquals(ref.size(), dbDnNode.getVolumeCount());
}
// Shutdown the DN first, to verify that calling diskbalancer APIs on
// uninitialized DN doesn't NPE
dnNode.shutdown();
assertEquals("", dnNode.getDiskBalancerStatus());
} finally {
cluster.shutdown();
}