diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index de970ba7d6a..6090ef78e4c 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -639,6 +639,9 @@ Release 2.4.0 - UNRELEASED HDFS-5533. Symlink delete/create should be treated as DELETE/CREATE in snapshot diff report. (Binglin Chang via jing9) + HDFS-5580. Fix infinite loop in Balancer.waitForMoveCompletion. + (Binglin Chang via junping_du) + Release 2.3.0 - UNRELEASED INCOMPATIBLE CHANGES diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/balancer/Balancer.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/balancer/Balancer.java index befdd90a79e..ff09ca54dd1 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/balancer/Balancer.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/balancer/Balancer.java @@ -292,26 +292,27 @@ private boolean markMovedIfGoodBlock(BalancerBlock block) { */ private boolean chooseProxySource() { final DatanodeInfo targetDN = target.getDatanode(); - boolean find = false; - for (BalancerDatanode loc : block.getLocations()) { - // check if there is replica which is on the same rack with the target - if (cluster.isOnSameRack(loc.getDatanode(), targetDN) && addTo(loc)) { - find = true; - // if cluster is not nodegroup aware or the proxy is on the same - // nodegroup with target, then we already find the nearest proxy - if (!cluster.isNodeGroupAware() - || cluster.isOnSameNodeGroup(loc.getDatanode(), targetDN)) { + // if node group is supported, first try add nodes in the same node group + if (cluster.isNodeGroupAware()) { + for (BalancerDatanode loc : block.getLocations()) { + if (cluster.isOnSameNodeGroup(loc.getDatanode(), targetDN) && addTo(loc)) { return true; } } - - if (!find) { - // find out a non-busy replica out of rack of target - find = addTo(loc); + } + // check if there is replica which is on the same rack with the target + for (BalancerDatanode loc : block.getLocations()) { + if (cluster.isOnSameRack(loc.getDatanode(), targetDN) && addTo(loc)) { + return true; } } - - return find; + // find out a non-busy replica + for (BalancerDatanode loc : block.getLocations()) { + if (addTo(loc)) { + return true; + } + } + return false; } // add a BalancerDatanode as proxy source for specific block movement