diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/diskbalancer/connectors/DBNameNodeConnector.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/diskbalancer/connectors/DBNameNodeConnector.java index f9bcd5e018065..f1407330df4e8 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/diskbalancer/connectors/DBNameNodeConnector.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/diskbalancer/connectors/DBNameNodeConnector.java @@ -133,7 +133,10 @@ private void getVolumeInfoFromStorageReports(DiskBalancerDataNode node, throws Exception { Preconditions.checkNotNull(node); Preconditions.checkNotNull(reports); - for (StorageReport report : reports) { + int len = reports.length; + boolean needComputeDensity = false; + for (int i = 0; i < len; i++) { + StorageReport report = reports[i]; DatanodeStorage storage = report.getStorage(); DiskBalancerVolume volume = new DiskBalancerVolume(); volume.setCapacity(report.getCapacity()); @@ -153,8 +156,10 @@ private void getVolumeInfoFromStorageReports(DiskBalancerDataNode node, .READ_ONLY_SHARED) || report.isFailed()); volume.setStorageType(storage.getStorageType().name()); volume.setIsTransient(storage.getStorageType().isTransient()); - node.addVolume(volume); + if (i == len - 1) { + needComputeDensity = true; + } + node.addVolume(volume, needComputeDensity); } - } } diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/diskbalancer/datamodel/DiskBalancerDataNode.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/diskbalancer/datamodel/DiskBalancerDataNode.java index fe9edf6678ac5..436cfdf24e948 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/diskbalancer/datamodel/DiskBalancerDataNode.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/diskbalancer/datamodel/DiskBalancerDataNode.java @@ -238,6 +238,10 @@ public boolean isBalancingNeeded(double threshold) { * @param volume - volume */ public void addVolume(DiskBalancerVolume volume) throws Exception { + addVolume(volume, true); + } + + public void addVolume(DiskBalancerVolume volume, boolean computeDensity) throws Exception { Preconditions.checkNotNull(volume, "volume cannot be null"); Preconditions.checkNotNull(volumeSets, "volume sets cannot be null"); Preconditions @@ -254,7 +258,9 @@ public void addVolume(DiskBalancerVolume volume) throws Exception { } vSet.addVolume(volume); - computeNodeDensity(); + if (computeDensity) { + computeNodeDensity(); + } } /**