|
@@ -49,6 +49,7 @@ import org.apache.hadoop.hdfs.MiniDFSCluster;
|
|
import org.apache.hadoop.hdfs.TestBlockStoragePolicy;
|
|
import org.apache.hadoop.hdfs.TestBlockStoragePolicy;
|
|
import org.apache.hadoop.hdfs.protocol.Block;
|
|
import org.apache.hadoop.hdfs.protocol.Block;
|
|
import org.apache.hadoop.hdfs.protocol.BlockStoragePolicy;
|
|
import org.apache.hadoop.hdfs.protocol.BlockStoragePolicy;
|
|
|
|
+import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
|
|
import org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.StatefulBlockInfo;
|
|
import org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.StatefulBlockInfo;
|
|
import org.apache.hadoop.hdfs.server.common.HdfsServerConstants;
|
|
import org.apache.hadoop.hdfs.server.common.HdfsServerConstants;
|
|
import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.BlockUCState;
|
|
import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.BlockUCState;
|
|
@@ -971,11 +972,11 @@ public class TestReplicationPolicy extends BaseReplicationPolicyTest {
|
|
// test returning null
|
|
// test returning null
|
|
excessTypes.add(StorageType.SSD);
|
|
excessTypes.add(StorageType.SSD);
|
|
assertNull(((BlockPlacementPolicyDefault) replicator)
|
|
assertNull(((BlockPlacementPolicyDefault) replicator)
|
|
- .chooseReplicaToDelete((short) 3, first, second, excessTypes));
|
|
|
|
|
|
+ .chooseReplicaToDelete(first, second, excessTypes));
|
|
}
|
|
}
|
|
excessTypes.add(StorageType.DEFAULT);
|
|
excessTypes.add(StorageType.DEFAULT);
|
|
DatanodeStorageInfo chosen = ((BlockPlacementPolicyDefault) replicator)
|
|
DatanodeStorageInfo chosen = ((BlockPlacementPolicyDefault) replicator)
|
|
- .chooseReplicaToDelete((short) 3, first, second, excessTypes);
|
|
|
|
|
|
+ .chooseReplicaToDelete(first, second, excessTypes);
|
|
// Within first set, storages[1] with less free space
|
|
// Within first set, storages[1] with less free space
|
|
assertEquals(chosen, storages[1]);
|
|
assertEquals(chosen, storages[1]);
|
|
|
|
|
|
@@ -985,25 +986,25 @@ public class TestReplicationPolicy extends BaseReplicationPolicyTest {
|
|
// Within second set, storages[5] with less free space
|
|
// Within second set, storages[5] with less free space
|
|
excessTypes.add(StorageType.DEFAULT);
|
|
excessTypes.add(StorageType.DEFAULT);
|
|
chosen = ((BlockPlacementPolicyDefault) replicator).chooseReplicaToDelete(
|
|
chosen = ((BlockPlacementPolicyDefault) replicator).chooseReplicaToDelete(
|
|
- (short)2, first, second, excessTypes);
|
|
|
|
|
|
+ first, second, excessTypes);
|
|
assertEquals(chosen, storages[5]);
|
|
assertEquals(chosen, storages[5]);
|
|
}
|
|
}
|
|
|
|
|
|
@Test
|
|
@Test
|
|
public void testChooseReplicasToDelete() throws Exception {
|
|
public void testChooseReplicasToDelete() throws Exception {
|
|
- Collection<DatanodeStorageInfo> nonExcess = new ArrayList<DatanodeStorageInfo>();
|
|
|
|
|
|
+ Collection<DatanodeStorageInfo> nonExcess = new ArrayList<>();
|
|
nonExcess.add(storages[0]);
|
|
nonExcess.add(storages[0]);
|
|
nonExcess.add(storages[1]);
|
|
nonExcess.add(storages[1]);
|
|
nonExcess.add(storages[2]);
|
|
nonExcess.add(storages[2]);
|
|
nonExcess.add(storages[3]);
|
|
nonExcess.add(storages[3]);
|
|
- List<DatanodeStorageInfo> excessReplicas = new ArrayList<>();
|
|
|
|
|
|
+ List<DatanodeStorageInfo> excessReplicas;
|
|
BlockStoragePolicySuite POLICY_SUITE = BlockStoragePolicySuite
|
|
BlockStoragePolicySuite POLICY_SUITE = BlockStoragePolicySuite
|
|
.createDefaultSuite();
|
|
.createDefaultSuite();
|
|
BlockStoragePolicy storagePolicy = POLICY_SUITE.getDefaultPolicy();
|
|
BlockStoragePolicy storagePolicy = POLICY_SUITE.getDefaultPolicy();
|
|
DatanodeStorageInfo excessSSD = DFSTestUtil.createDatanodeStorageInfo(
|
|
DatanodeStorageInfo excessSSD = DFSTestUtil.createDatanodeStorageInfo(
|
|
"Storage-excess-SSD-ID", "localhost",
|
|
"Storage-excess-SSD-ID", "localhost",
|
|
storages[0].getDatanodeDescriptor().getNetworkLocation(),
|
|
storages[0].getDatanodeDescriptor().getNetworkLocation(),
|
|
- "foo.com", StorageType.SSD);
|
|
|
|
|
|
+ "foo.com", StorageType.SSD, null);
|
|
updateHeartbeatWithUsage(excessSSD.getDatanodeDescriptor(),
|
|
updateHeartbeatWithUsage(excessSSD.getDatanodeDescriptor(),
|
|
2* HdfsServerConstants.MIN_BLOCKS_FOR_WRITE*BLOCK_SIZE, 0L,
|
|
2* HdfsServerConstants.MIN_BLOCKS_FOR_WRITE*BLOCK_SIZE, 0L,
|
|
2* HdfsServerConstants.MIN_BLOCKS_FOR_WRITE*BLOCK_SIZE, 0L, 0L, 0L, 0,
|
|
2* HdfsServerConstants.MIN_BLOCKS_FOR_WRITE*BLOCK_SIZE, 0L, 0L, 0L, 0,
|
|
@@ -1016,14 +1017,14 @@ public class TestReplicationPolicy extends BaseReplicationPolicyTest {
|
|
DatanodeStorageInfo.toStorageTypes(nonExcess));
|
|
DatanodeStorageInfo.toStorageTypes(nonExcess));
|
|
excessReplicas = replicator.chooseReplicasToDelete(nonExcess, 3,
|
|
excessReplicas = replicator.chooseReplicasToDelete(nonExcess, 3,
|
|
excessTypes, storages[3].getDatanodeDescriptor(), delHintNode);
|
|
excessTypes, storages[3].getDatanodeDescriptor(), delHintNode);
|
|
- assertTrue(excessReplicas.size() > 0);
|
|
|
|
|
|
+ assertTrue(excessReplicas.size() == 1);
|
|
assertTrue(excessReplicas.contains(storages[0]));
|
|
assertTrue(excessReplicas.contains(storages[0]));
|
|
|
|
|
|
// Excess type deletion
|
|
// Excess type deletion
|
|
|
|
|
|
DatanodeStorageInfo excessStorage = DFSTestUtil.createDatanodeStorageInfo(
|
|
DatanodeStorageInfo excessStorage = DFSTestUtil.createDatanodeStorageInfo(
|
|
"Storage-excess-ID", "localhost", delHintNode.getNetworkLocation(),
|
|
"Storage-excess-ID", "localhost", delHintNode.getNetworkLocation(),
|
|
- "foo.com", StorageType.ARCHIVE);
|
|
|
|
|
|
+ "foo.com", StorageType.ARCHIVE, null);
|
|
nonExcess.add(excessStorage);
|
|
nonExcess.add(excessStorage);
|
|
excessTypes = storagePolicy.chooseExcess((short) 3,
|
|
excessTypes = storagePolicy.chooseExcess((short) 3,
|
|
DatanodeStorageInfo.toStorageTypes(nonExcess));
|
|
DatanodeStorageInfo.toStorageTypes(nonExcess));
|
|
@@ -1057,32 +1058,70 @@ public class TestReplicationPolicy extends BaseReplicationPolicyTest {
|
|
|
|
|
|
@Test
|
|
@Test
|
|
public void testUseDelHint() throws Exception {
|
|
public void testUseDelHint() throws Exception {
|
|
- List<StorageType> excessTypes = new ArrayList<StorageType>();
|
|
|
|
|
|
+ List<StorageType> excessTypes = new ArrayList<>();
|
|
excessTypes.add(StorageType.ARCHIVE);
|
|
excessTypes.add(StorageType.ARCHIVE);
|
|
- // only consider delHint for the first case
|
|
|
|
- assertFalse(BlockPlacementPolicyDefault.useDelHint(false, null, null, null,
|
|
|
|
- null));
|
|
|
|
|
|
+ BlockPlacementPolicyDefault policyDefault =
|
|
|
|
+ (BlockPlacementPolicyDefault) replicator;
|
|
// no delHint
|
|
// no delHint
|
|
- assertFalse(BlockPlacementPolicyDefault.useDelHint(true, null, null, null,
|
|
|
|
- null));
|
|
|
|
|
|
+ assertFalse(policyDefault.useDelHint(null, null, null, null, null));
|
|
// delHint storage type is not an excess type
|
|
// delHint storage type is not an excess type
|
|
- assertFalse(BlockPlacementPolicyDefault.useDelHint(true, storages[0], null,
|
|
|
|
- null, excessTypes));
|
|
|
|
|
|
+ assertFalse(policyDefault.useDelHint(storages[0], null, null, null,
|
|
|
|
+ excessTypes));
|
|
// check if removing delHint reduces the number of racks
|
|
// check if removing delHint reduces the number of racks
|
|
- List<DatanodeStorageInfo> chosenNodes = new ArrayList<DatanodeStorageInfo>();
|
|
|
|
- chosenNodes.add(storages[0]);
|
|
|
|
- chosenNodes.add(storages[2]);
|
|
|
|
|
|
+ List<DatanodeStorageInfo> moreThanOne = new ArrayList<>();
|
|
|
|
+ moreThanOne.add(storages[0]);
|
|
|
|
+ moreThanOne.add(storages[1]);
|
|
|
|
+ List<DatanodeStorageInfo> exactlyOne = new ArrayList<>();
|
|
|
|
+ exactlyOne.add(storages[3]);
|
|
|
|
+ exactlyOne.add(storages[5]);
|
|
|
|
+
|
|
excessTypes.add(StorageType.DEFAULT);
|
|
excessTypes.add(StorageType.DEFAULT);
|
|
- assertTrue(BlockPlacementPolicyDefault.useDelHint(true, storages[0], null,
|
|
|
|
- chosenNodes, excessTypes));
|
|
|
|
|
|
+ assertTrue(policyDefault.useDelHint(storages[0], null, moreThanOne,
|
|
|
|
+ exactlyOne, excessTypes));
|
|
// the added node adds a new rack
|
|
// the added node adds a new rack
|
|
- assertTrue(BlockPlacementPolicyDefault.useDelHint(true, storages[3],
|
|
|
|
- storages[5], chosenNodes, excessTypes));
|
|
|
|
|
|
+ assertTrue(policyDefault.useDelHint(storages[3], storages[5], moreThanOne,
|
|
|
|
+ exactlyOne, excessTypes));
|
|
// removing delHint reduces the number of racks;
|
|
// removing delHint reduces the number of racks;
|
|
- assertFalse(BlockPlacementPolicyDefault.useDelHint(true, storages[3],
|
|
|
|
- storages[0], chosenNodes, excessTypes));
|
|
|
|
- assertFalse(BlockPlacementPolicyDefault.useDelHint(true, storages[3], null,
|
|
|
|
- chosenNodes, excessTypes));
|
|
|
|
|
|
+ assertFalse(policyDefault.useDelHint(storages[3], storages[0], moreThanOne,
|
|
|
|
+ exactlyOne, excessTypes));
|
|
|
|
+ assertFalse(policyDefault.useDelHint(storages[3], null, moreThanOne,
|
|
|
|
+ exactlyOne, excessTypes));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Test
|
|
|
|
+ public void testIsMovable() throws Exception {
|
|
|
|
+ List<DatanodeInfo> candidates = new ArrayList<>();
|
|
|
|
+
|
|
|
|
+ // after the move, the number of racks remains 2.
|
|
|
|
+ candidates.add(dataNodes[0]);
|
|
|
|
+ candidates.add(dataNodes[1]);
|
|
|
|
+ candidates.add(dataNodes[2]);
|
|
|
|
+ candidates.add(dataNodes[3]);
|
|
|
|
+ assertTrue(replicator.isMovable(candidates, dataNodes[0], dataNodes[3]));
|
|
|
|
+
|
|
|
|
+ // after the move, the number of racks remains 3.
|
|
|
|
+ candidates.clear();
|
|
|
|
+ candidates.add(dataNodes[0]);
|
|
|
|
+ candidates.add(dataNodes[1]);
|
|
|
|
+ candidates.add(dataNodes[2]);
|
|
|
|
+ candidates.add(dataNodes[4]);
|
|
|
|
+ assertTrue(replicator.isMovable(candidates, dataNodes[0], dataNodes[1]));
|
|
|
|
+
|
|
|
|
+ // after the move, the number of racks changes from 2 to 3.
|
|
|
|
+ candidates.clear();
|
|
|
|
+ candidates.add(dataNodes[0]);
|
|
|
|
+ candidates.add(dataNodes[1]);
|
|
|
|
+ candidates.add(dataNodes[2]);
|
|
|
|
+ candidates.add(dataNodes[4]);
|
|
|
|
+ assertTrue(replicator.isMovable(candidates, dataNodes[0], dataNodes[4]));
|
|
|
|
+
|
|
|
|
+ // the move would have reduced the number of racks from 3 to 2.
|
|
|
|
+ candidates.clear();
|
|
|
|
+ candidates.add(dataNodes[0]);
|
|
|
|
+ candidates.add(dataNodes[2]);
|
|
|
|
+ candidates.add(dataNodes[3]);
|
|
|
|
+ candidates.add(dataNodes[4]);
|
|
|
|
+ assertFalse(replicator.isMovable(candidates, dataNodes[0], dataNodes[3]));
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|