HDFS-4351. In BlockPlacementPolicyDefault.chooseTarget(..), numOfReplicas needs to be updated when avoiding stale nodes. Contributed by Andrew Wang
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1429653 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
bbc426f53a
commit
6a76ec14ad
@ -759,6 +759,8 @@ Release 2.0.3-alpha - Unreleased
|
||||
HDFS-4017. Unclosed FileInputStream in GetJournalEditServlet
|
||||
(Chao Shi via todd)
|
||||
|
||||
HDFS-4351. In BlockPlacementPolicyDefault.chooseTarget(..), numOfReplicas
|
||||
needs to be updated when avoiding stale nodes. (Andrew Wang via szetszwo)
|
||||
|
||||
Release 2.0.2-alpha - 2012-09-07
|
||||
|
||||
|
@ -236,13 +236,18 @@ private DatanodeDescriptor chooseTarget(int numOfReplicas,
|
||||
+ totalReplicasExpected + "\n"
|
||||
+ e.getMessage());
|
||||
if (avoidStaleNodes) {
|
||||
// excludedNodes now has - initial excludedNodes, any nodes that were
|
||||
// chosen and nodes that were tried but were not chosen because they
|
||||
// were stale, decommissioned or for any other reason a node is not
|
||||
// chosen for write. Retry again now not avoiding stale node
|
||||
// Retry chooseTarget again, this time not avoiding stale nodes.
|
||||
|
||||
// excludedNodes contains the initial excludedNodes and nodes that were
|
||||
// not chosen because they were stale, decommissioned, etc.
|
||||
// We need to additionally exclude the nodes that were added to the
|
||||
// result list in the successful calls to choose*() above.
|
||||
for (Node node : results) {
|
||||
oldExcludedNodes.put(node, node);
|
||||
}
|
||||
// Set numOfReplicas, since it can get out of sync with the result list
|
||||
// if the NotEnoughReplicasException was thrown in chooseRandom().
|
||||
numOfReplicas = totalReplicasExpected - results.size();
|
||||
return chooseTarget(numOfReplicas, writer, oldExcludedNodes, blocksize,
|
||||
maxNodesPerRack, results, false);
|
||||
}
|
||||
@ -542,7 +547,7 @@ protected boolean isGoodTarget(DatanodeDescriptor node,
|
||||
if (LOG.isDebugEnabled()) {
|
||||
threadLocalBuilder.get().append(node.toString()).append(": ")
|
||||
.append("Node ").append(NodeBase.getPath(node))
|
||||
.append(" is not chosen because the node is staled ");
|
||||
.append(" is not chosen because the node is stale ");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -382,6 +382,24 @@ public void testChooseTarget5() throws Exception {
|
||||
assertTrue(cluster.isOnSameRack(targets[1], targets[2]));
|
||||
assertFalse(cluster.isOnSameRack(targets[0], targets[1]));
|
||||
}
|
||||
|
||||
/**
|
||||
* In this testcase, it tries to choose more targets than available nodes and
|
||||
* check the result, with stale node avoidance on the write path enabled.
|
||||
* @throws Exception
|
||||
*/
|
||||
@Test
|
||||
public void testChooseTargetWithMoreThanAvailableNodesWithStaleness()
|
||||
throws Exception {
|
||||
try {
|
||||
namenode.getNamesystem().getBlockManager().getDatanodeManager()
|
||||
.setAvoidStaleDataNodesForWrite(true);
|
||||
testChooseTargetWithMoreThanAvailableNodes();
|
||||
} finally {
|
||||
namenode.getNamesystem().getBlockManager().getDatanodeManager()
|
||||
.setAvoidStaleDataNodesForWrite(false);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* In this testcase, it tries to choose more targets than available nodes and
|
||||
@ -389,7 +407,7 @@ public void testChooseTarget5() throws Exception {
|
||||
* @throws Exception
|
||||
*/
|
||||
@Test
|
||||
public void testChooseTargetWithMoreThanAvaiableNodes() throws Exception {
|
||||
public void testChooseTargetWithMoreThanAvailableNodes() throws Exception {
|
||||
// make data node 0 & 1 to be not qualified to choose: not enough disk space
|
||||
for(int i=0; i<2; i++) {
|
||||
dataNodes[i].updateHeartbeat(
|
||||
|
Loading…
Reference in New Issue
Block a user