From 9d406e5dc88cc5d88a834a19cec6ad310bbd82a6 Mon Sep 17 00:00:00 2001 From: Konstantin V Shvachko Date: Tue, 28 Nov 2017 17:14:23 -0800 Subject: [PATCH] HDFS-12832. INode.getFullPathName may throw ArrayIndexOutOfBoundsException lead to NameNode exit. Contribuited by Konstantin Shvachko. (cherry picked from commit d331762f24b3f22f609366740c9c4f449edc61ac) --- .../server/blockmanagement/BlockManager.java | 2 -- .../blockmanagement/ReplicationWork.java | 18 ++++++++++++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/BlockManager.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/BlockManager.java index a49cb248a23..bdb926cf518 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/BlockManager.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/BlockManager.java @@ -1592,8 +1592,6 @@ public class BlockManager implements BlockStatsMXBean { } // choose replication targets: NOT HOLDING THE GLOBAL LOCK - // It is costly to extract the filename for which chooseTargets is called, - // so for now we pass in the block collection itself. rw.chooseTargets(blockplacement, storagePolicySuite, excludedNodes); } diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/ReplicationWork.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/ReplicationWork.java index 258dfddafeb..8362096ece1 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/ReplicationWork.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/ReplicationWork.java @@ -25,7 +25,8 @@ import java.util.Set; class ReplicationWork { private final BlockInfo block; - private final BlockCollection bc; + private final String srcPath; + private final byte storagePolicyID; private final DatanodeDescriptor srcNode; private final int additionalReplRequired; private final int priority; @@ -38,7 +39,8 @@ class ReplicationWork { List liveReplicaStorages, int additionalReplRequired, int priority) { this.block = block; - this.bc = bc; + this.srcPath = bc.getName(); + this.storagePolicyID = bc.getStoragePolicyID(); this.srcNode = srcNode; this.srcNode.incrementPendingReplicationWithoutTargets(); this.containingNodes = containingNodes; @@ -52,10 +54,10 @@ class ReplicationWork { BlockStoragePolicySuite storagePolicySuite, Set excludedNodes) { try { - targets = blockplacement.chooseTarget(bc.getName(), + targets = blockplacement.chooseTarget(getSrcPath(), additionalReplRequired, srcNode, liveReplicaStorages, false, excludedNodes, block.getNumBytes(), - storagePolicySuite.getPolicy(bc.getStoragePolicyID()), null); + storagePolicySuite.getPolicy(getStoragePolicyID()), null); } finally { srcNode.decrementPendingReplicationWithoutTargets(); } @@ -84,4 +86,12 @@ class ReplicationWork { public DatanodeDescriptor getSrcNode() { return srcNode; } + + public String getSrcPath() { + return srcPath; + } + + public byte getStoragePolicyID() { + return storagePolicyID; + } }