From 327a995561270bc01c024e38ddd1063c42ff2e3c Mon Sep 17 00:00:00 2001 From: Junping Du Date: Wed, 11 Dec 2013 08:51:12 +0000 Subject: [PATCH] HDFS-5580. Fix infinite loop in Balancer.waitForMoveCompletion. (Binglin Chang via junping_du) git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1550074 13f79535-47bb-0310-9956-ffa450edef68 --- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 ++ .../hadoop/hdfs/server/balancer/Balancer.java | 31 ++++++++++--------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index de970ba7d6..6090ef78e4 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 befdd90a79..ff09ca54dd 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