|
@@ -87,9 +87,11 @@ public class TestReplicationPolicy {
|
|
|
"test.build.data", "build/test/data"), "dfs/");
|
|
|
conf.set(DFSConfigKeys.DFS_NAMENODE_NAME_DIR_KEY,
|
|
|
new File(baseDir, "name").getPath());
|
|
|
- // Enable the checking for stale datanodes in the beginning
|
|
|
- conf.setBoolean(DFSConfigKeys.DFS_NAMENODE_CHECK_STALE_DATANODE_KEY, true);
|
|
|
|
|
|
+ conf.setBoolean(
|
|
|
+ DFSConfigKeys.DFS_NAMENODE_AVOID_STALE_DATANODE_FOR_READ_KEY, true);
|
|
|
+ conf.setBoolean(
|
|
|
+ DFSConfigKeys.DFS_NAMENODE_AVOID_STALE_DATANODE_FOR_WRITE_KEY, true);
|
|
|
DFSTestUtil.formatNameNode(conf);
|
|
|
namenode = new NameNode(conf);
|
|
|
|
|
@@ -99,6 +101,8 @@ public class TestReplicationPolicy {
|
|
|
// construct network topology
|
|
|
for (int i=0; i < NUM_OF_DATANODES; i++) {
|
|
|
cluster.add(dataNodes[i]);
|
|
|
+ bm.getDatanodeManager().getHeartbeatManager().addDatanode(
|
|
|
+ dataNodes[i]);
|
|
|
}
|
|
|
for (int i=0; i < NUM_OF_DATANODES; i++) {
|
|
|
dataNodes[i].updateHeartbeat(
|
|
@@ -392,11 +396,11 @@ public class TestReplicationPolicy {
|
|
|
throws Exception {
|
|
|
try {
|
|
|
namenode.getNamesystem().getBlockManager().getDatanodeManager()
|
|
|
- .setAvoidStaleDataNodesForWrite(true);
|
|
|
+ .setNumStaleNodes(NUM_OF_DATANODES);
|
|
|
testChooseTargetWithMoreThanAvailableNodes();
|
|
|
} finally {
|
|
|
namenode.getNamesystem().getBlockManager().getDatanodeManager()
|
|
|
- .setAvoidStaleDataNodesForWrite(false);
|
|
|
+ .setNumStaleNodes(0);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -478,12 +482,12 @@ public class TestReplicationPolicy {
|
|
|
|
|
|
@Test
|
|
|
public void testChooseTargetWithStaleNodes() throws Exception {
|
|
|
- // Enable avoidng writing to stale datanodes
|
|
|
- namenode.getNamesystem().getBlockManager().getDatanodeManager()
|
|
|
- .setAvoidStaleDataNodesForWrite(true);
|
|
|
// Set dataNodes[0] as stale
|
|
|
dataNodes[0].setLastUpdate(Time.now() - staleInterval - 1);
|
|
|
-
|
|
|
+ namenode.getNamesystem().getBlockManager()
|
|
|
+ .getDatanodeManager().getHeartbeatManager().heartbeatCheck();
|
|
|
+ assertTrue(namenode.getNamesystem().getBlockManager()
|
|
|
+ .getDatanodeManager().shouldAvoidStaleDataNodesForWrite());
|
|
|
DatanodeDescriptor[] targets;
|
|
|
// We set the datanode[0] as stale, thus should choose datanode[1] since
|
|
|
// datanode[1] is on the same rack with datanode[0] (writer)
|
|
@@ -502,9 +506,9 @@ public class TestReplicationPolicy {
|
|
|
assertFalse(cluster.isOnSameRack(targets[0], dataNodes[0]));
|
|
|
|
|
|
// reset
|
|
|
- namenode.getNamesystem().getBlockManager().getDatanodeManager()
|
|
|
- .setAvoidStaleDataNodesForWrite(false);
|
|
|
dataNodes[0].setLastUpdate(Time.now());
|
|
|
+ namenode.getNamesystem().getBlockManager()
|
|
|
+ .getDatanodeManager().getHeartbeatManager().heartbeatCheck();
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -517,20 +521,20 @@ public class TestReplicationPolicy {
|
|
|
*/
|
|
|
@Test
|
|
|
public void testChooseTargetWithHalfStaleNodes() throws Exception {
|
|
|
- // Enable stale datanodes checking
|
|
|
- namenode.getNamesystem().getBlockManager().getDatanodeManager()
|
|
|
- .setAvoidStaleDataNodesForWrite(true);
|
|
|
// Set dataNodes[0], dataNodes[1], and dataNodes[2] as stale
|
|
|
for (int i = 0; i < 3; i++) {
|
|
|
dataNodes[i].setLastUpdate(Time.now() - staleInterval - 1);
|
|
|
}
|
|
|
+ namenode.getNamesystem().getBlockManager()
|
|
|
+ .getDatanodeManager().getHeartbeatManager().heartbeatCheck();
|
|
|
|
|
|
DatanodeDescriptor[] targets;
|
|
|
targets = replicator.chooseTarget(filename, 0, dataNodes[0],
|
|
|
new ArrayList<DatanodeDescriptor>(), BLOCK_SIZE);
|
|
|
assertEquals(targets.length, 0);
|
|
|
|
|
|
- // We set the datanode[0] as stale, thus should choose datanode[1]
|
|
|
+ // Since we have 6 datanodes total, stale nodes should
|
|
|
+ // not be returned until we ask for more than 3 targets
|
|
|
targets = replicator.chooseTarget(filename, 1, dataNodes[0],
|
|
|
new ArrayList<DatanodeDescriptor>(), BLOCK_SIZE);
|
|
|
assertEquals(targets.length, 1);
|
|
@@ -556,18 +560,16 @@ public class TestReplicationPolicy {
|
|
|
assertTrue(containsWithinRange(dataNodes[4], targets, 0, 3));
|
|
|
assertTrue(containsWithinRange(dataNodes[5], targets, 0, 3));
|
|
|
|
|
|
- // reset
|
|
|
- namenode.getNamesystem().getBlockManager().getDatanodeManager()
|
|
|
- .setAvoidStaleDataNodesForWrite(false);
|
|
|
for (int i = 0; i < dataNodes.length; i++) {
|
|
|
dataNodes[i].setLastUpdate(Time.now());
|
|
|
}
|
|
|
+ namenode.getNamesystem().getBlockManager()
|
|
|
+ .getDatanodeManager().getHeartbeatManager().heartbeatCheck();
|
|
|
}
|
|
|
|
|
|
@Test
|
|
|
public void testChooseTargetWithMoreThanHalfStaleNodes() throws Exception {
|
|
|
HdfsConfiguration conf = new HdfsConfiguration();
|
|
|
- conf.setBoolean(DFSConfigKeys.DFS_NAMENODE_CHECK_STALE_DATANODE_KEY, true);
|
|
|
conf.setBoolean(
|
|
|
DFSConfigKeys.DFS_NAMENODE_AVOID_STALE_DATANODE_FOR_WRITE_KEY, true);
|
|
|
String[] hosts = new String[]{"host1", "host2", "host3",
|
|
@@ -597,7 +599,7 @@ public class TestReplicationPolicy {
|
|
|
.getBlockManager().getDatanodeManager().getNumStaleNodes();
|
|
|
assertEquals(numStaleNodes, 2);
|
|
|
assertTrue(miniCluster.getNameNode().getNamesystem().getBlockManager()
|
|
|
- .getDatanodeManager().isAvoidingStaleDataNodesForWrite());
|
|
|
+ .getDatanodeManager().shouldAvoidStaleDataNodesForWrite());
|
|
|
// Call chooseTarget
|
|
|
DatanodeDescriptor staleNodeInfo = miniCluster.getNameNode()
|
|
|
.getNamesystem().getBlockManager().getDatanodeManager()
|
|
@@ -626,7 +628,7 @@ public class TestReplicationPolicy {
|
|
|
// According to our strategy, stale datanodes will be included for writing
|
|
|
// to avoid hotspots
|
|
|
assertFalse(miniCluster.getNameNode().getNamesystem().getBlockManager()
|
|
|
- .getDatanodeManager().isAvoidingStaleDataNodesForWrite());
|
|
|
+ .getDatanodeManager().shouldAvoidStaleDataNodesForWrite());
|
|
|
// Call chooseTarget
|
|
|
targets = replicator.chooseTarget(filename, 3,
|
|
|
staleNodeInfo, new ArrayList<DatanodeDescriptor>(), BLOCK_SIZE);
|
|
@@ -649,7 +651,7 @@ public class TestReplicationPolicy {
|
|
|
.getBlockManager().getDatanodeManager().getNumStaleNodes();
|
|
|
assertEquals(numStaleNodes, 2);
|
|
|
assertTrue(miniCluster.getNameNode().getNamesystem().getBlockManager()
|
|
|
- .getDatanodeManager().isAvoidingStaleDataNodesForWrite());
|
|
|
+ .getDatanodeManager().shouldAvoidStaleDataNodesForWrite());
|
|
|
// Call chooseTarget
|
|
|
targets = replicator.chooseTarget(filename, 3,
|
|
|
staleNodeInfo, new ArrayList<DatanodeDescriptor>(), BLOCK_SIZE);
|