From 936e0df0d344f13eea97fe624b154e8356cdea7c Mon Sep 17 00:00:00 2001 From: Xiao Chen Date: Fri, 6 Jul 2018 20:45:27 -0700 Subject: [PATCH] HDFS-13721. NPE in DataNode due to uninitialized DiskBalancer. --- .../hadoop/hdfs/server/datanode/DataNode.java | 19 +++++++++++++------ .../server/diskbalancer/TestDiskBalancer.java | 5 +++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java index 4baafb92847..7df92f6083c 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java @@ -3132,7 +3132,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 ""; @@ -3510,7 +3510,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); } @@ -3522,7 +3522,7 @@ public class DataNode extends ReconfigurableBase public void cancelDiskBalancePlan(String planID) throws IOException { checkSuperuserPrivilege(); - this.diskBalancer.cancelPlan(planID); + getDiskBalancer().cancelPlan(planID); } /** @@ -3533,7 +3533,7 @@ public class DataNode extends ReconfigurableBase @Override public DiskBalancerWorkStatus queryDiskBalancerPlan() throws IOException { checkSuperuserPrivilege(); - return this.diskBalancer.queryWorkStatus(); + return getDiskBalancer().queryWorkStatus(); } /** @@ -3550,9 +3550,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); @@ -3606,4 +3606,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; + } } diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/diskbalancer/TestDiskBalancer.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/diskbalancer/TestDiskBalancer.java index 55cc57ed03f..e7896944f64 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/diskbalancer/TestDiskBalancer.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/diskbalancer/TestDiskBalancer.java @@ -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(); }