HDFS-12832. INode.getFullPathName may throw ArrayIndexOutOfBoundsException lead to NameNode exit. Contribuited by Konstantin Shvachko.

(cherry picked from commit d331762f24)
(cherry picked from commit 3219b1bdf6)
This commit is contained in:
Konstantin V Shvachko 2017-11-28 17:14:23 -08:00 committed by Junping Du
parent f92fea391e
commit a32ae95b09
2 changed files with 14 additions and 6 deletions

View File

@ -1527,8 +1527,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);
}

View File

@ -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<DatanodeStorageInfo> 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<Node> 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;
}
}