Repository: hadoop Updated Branches: refs/heads/branch-2.8 e8cd1439d -> 575802683
HDFS-10715. NPE when applying AvailableSpaceBlockPlacementPolicy. Contributed by Guangbin Zhu. (cherry picked from commit ef432579a7763cc0e482fe049027c6e5325eb034) (cherry picked from commit 68638661271e6e69c220b19fec7cbc7ae5e6208e) Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/57580268 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/57580268 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/57580268 Branch: refs/heads/branch-2.8 Commit: 57580268330222699c7c67766e27679b3b31968c Parents: e8cd143 Author: Akira Ajisaka <aajis...@apache.org> Authored: Fri Aug 5 17:31:11 2016 +0900 Committer: Akira Ajisaka <aajis...@apache.org> Committed: Fri Aug 5 17:33:07 2016 +0900 ---------------------------------------------------------------------- .../AvailableSpaceBlockPlacementPolicy.java | 16 ++++++++++------ .../TestAvailableSpaceBlockPlacementPolicy.java | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/57580268/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/AvailableSpaceBlockPlacementPolicy.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/AvailableSpaceBlockPlacementPolicy.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/AvailableSpaceBlockPlacementPolicy.java index fcd01bd..706768c 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/AvailableSpaceBlockPlacementPolicy.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/AvailableSpaceBlockPlacementPolicy.java @@ -76,13 +76,17 @@ public class AvailableSpaceBlockPlacementPolicy extends (DatanodeDescriptor) clusterMap.chooseRandom(scope, excludedNode); DatanodeDescriptor b = (DatanodeDescriptor) clusterMap.chooseRandom(scope, excludedNode); - int ret = compareDataNode(a, b); - if (ret == 0) { - return a; - } else if (ret < 0) { - return (RAND.nextInt(100) < balancedPreference) ? a : b; + if (a != null && b != null){ + int ret = compareDataNode(a, b); + if (ret == 0) { + return a; + } else if (ret < 0) { + return (RAND.nextInt(100) < balancedPreference) ? a : b; + } else { + return (RAND.nextInt(100) < balancedPreference) ? b : a; + } } else { - return (RAND.nextInt(100) < balancedPreference) ? b : a; + return a == null ? b : a; } } http://git-wip-us.apache.org/repos/asf/hadoop/blob/57580268/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/blockmanagement/TestAvailableSpaceBlockPlacementPolicy.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/blockmanagement/TestAvailableSpaceBlockPlacementPolicy.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/blockmanagement/TestAvailableSpaceBlockPlacementPolicy.java index a5090cc..5b8ad1c 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/blockmanagement/TestAvailableSpaceBlockPlacementPolicy.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/blockmanagement/TestAvailableSpaceBlockPlacementPolicy.java @@ -20,6 +20,8 @@ package org.apache.hadoop.hdfs.server.blockmanagement; import java.io.File; import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; @@ -30,6 +32,7 @@ import org.apache.hadoop.hdfs.TestBlockStoragePolicy; import org.apache.hadoop.hdfs.server.common.HdfsServerConstants; import org.apache.hadoop.hdfs.server.namenode.NameNode; import org.apache.hadoop.net.NetworkTopology; +import org.apache.hadoop.net.Node; import org.apache.hadoop.test.PathUtils; import org.junit.AfterClass; import org.junit.Assert; @@ -158,6 +161,21 @@ public class TestAvailableSpaceBlockPlacementPolicy { Assert.assertTrue(possibility < 0.55); } + @Test + public void testChooseDataNode() { + try { + Collection<Node> allNodes = new ArrayList<>(dataNodes.length); + Collections.addAll(allNodes, dataNodes); + if (placementPolicy instanceof AvailableSpaceBlockPlacementPolicy){ + // exclude all datanodes when chooseDataNode, no NPE should be thrown + ((AvailableSpaceBlockPlacementPolicy)placementPolicy) + .chooseDataNode("~", allNodes); + } + }catch (NullPointerException npe){ + Assert.fail("NPE should not be thrown"); + } + } + @AfterClass public static void teardownCluster() { if (namenode != null) { --------------------------------------------------------------------- To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org For additional commands, e-mail: common-commits-h...@hadoop.apache.org