|
@@ -150,7 +150,16 @@ public class BlockPlacementPolicyDefault extends BlockPlacementPolicy {
|
|
|
final BlockStoragePolicy storagePolicy,
|
|
|
EnumSet<AddBlockFlag> flags) {
|
|
|
return chooseTarget(numOfReplicas, writer, chosenNodes, returnChosenNodes,
|
|
|
- excludedNodes, blocksize, storagePolicy, flags);
|
|
|
+ excludedNodes, blocksize, storagePolicy, flags, null);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public DatanodeStorageInfo[] chooseTarget(String srcPath, int numOfReplicas,
|
|
|
+ Node writer, List<DatanodeStorageInfo> chosen, boolean returnChosenNodes,
|
|
|
+ Set<Node> excludedNodes, long blocksize, BlockStoragePolicy storagePolicy,
|
|
|
+ EnumSet<AddBlockFlag> flags, EnumMap<StorageType, Integer> storageTypes) {
|
|
|
+ return chooseTarget(numOfReplicas, writer, chosen, returnChosenNodes,
|
|
|
+ excludedNodes, blocksize, storagePolicy, flags, storageTypes);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -202,7 +211,8 @@ public class BlockPlacementPolicyDefault extends BlockPlacementPolicy {
|
|
|
DatanodeStorageInfo[] remainingTargets =
|
|
|
chooseTarget(src, numOfReplicas, writer,
|
|
|
new ArrayList<DatanodeStorageInfo>(numOfReplicas), false,
|
|
|
- favoriteAndExcludedNodes, blocksize, storagePolicy, flags);
|
|
|
+ favoriteAndExcludedNodes, blocksize, storagePolicy, flags,
|
|
|
+ storageTypes);
|
|
|
for (int i = 0; i < remainingTargets.length; i++) {
|
|
|
results.add(remainingTargets[i]);
|
|
|
}
|
|
@@ -252,7 +262,8 @@ public class BlockPlacementPolicyDefault extends BlockPlacementPolicy {
|
|
|
Set<Node> excludedNodes,
|
|
|
long blocksize,
|
|
|
final BlockStoragePolicy storagePolicy,
|
|
|
- EnumSet<AddBlockFlag> addBlockFlags) {
|
|
|
+ EnumSet<AddBlockFlag> addBlockFlags,
|
|
|
+ EnumMap<StorageType, Integer> sTypes) {
|
|
|
if (numOfReplicas == 0 || clusterMap.getNumOfLeaves()==0) {
|
|
|
return DatanodeStorageInfo.EMPTY_ARRAY;
|
|
|
}
|
|
@@ -290,7 +301,7 @@ public class BlockPlacementPolicyDefault extends BlockPlacementPolicy {
|
|
|
localNode = chooseTarget(numOfReplicas, writer,
|
|
|
excludedNodeCopy, blocksize, maxNodesPerRack, results,
|
|
|
avoidStaleNodes, storagePolicy,
|
|
|
- EnumSet.noneOf(StorageType.class), results.isEmpty());
|
|
|
+ EnumSet.noneOf(StorageType.class), results.isEmpty(), sTypes);
|
|
|
if (results.size() < numOfReplicas) {
|
|
|
// not enough nodes; discard results and fall back
|
|
|
results = null;
|
|
@@ -300,7 +311,8 @@ public class BlockPlacementPolicyDefault extends BlockPlacementPolicy {
|
|
|
results = new ArrayList<>(chosenStorage);
|
|
|
localNode = chooseTarget(numOfReplicas, writer, excludedNodes,
|
|
|
blocksize, maxNodesPerRack, results, avoidStaleNodes,
|
|
|
- storagePolicy, EnumSet.noneOf(StorageType.class), results.isEmpty());
|
|
|
+ storagePolicy, EnumSet.noneOf(StorageType.class), results.isEmpty(),
|
|
|
+ sTypes);
|
|
|
}
|
|
|
|
|
|
if (!returnChosenNodes) {
|
|
@@ -380,6 +392,7 @@ public class BlockPlacementPolicyDefault extends BlockPlacementPolicy {
|
|
|
* @param maxNodesPerRack max nodes allowed per rack
|
|
|
* @param results the target nodes already chosen
|
|
|
* @param avoidStaleNodes avoid stale nodes in replica choosing
|
|
|
+ * @param storageTypes storage type to be considered for target
|
|
|
* @return local node of writer (not chosen node)
|
|
|
*/
|
|
|
private Node chooseTarget(int numOfReplicas,
|
|
@@ -391,7 +404,8 @@ public class BlockPlacementPolicyDefault extends BlockPlacementPolicy {
|
|
|
final boolean avoidStaleNodes,
|
|
|
final BlockStoragePolicy storagePolicy,
|
|
|
final EnumSet<StorageType> unavailableStorages,
|
|
|
- final boolean newBlock) {
|
|
|
+ final boolean newBlock,
|
|
|
+ EnumMap<StorageType, Integer> storageTypes) {
|
|
|
if (numOfReplicas == 0 || clusterMap.getNumOfLeaves()==0) {
|
|
|
return (writer instanceof DatanodeDescriptor) ? writer : null;
|
|
|
}
|
|
@@ -409,8 +423,9 @@ public class BlockPlacementPolicyDefault extends BlockPlacementPolicy {
|
|
|
.chooseStorageTypes((short) totalReplicasExpected,
|
|
|
DatanodeStorageInfo.toStorageTypes(results),
|
|
|
unavailableStorages, newBlock);
|
|
|
- final EnumMap<StorageType, Integer> storageTypes =
|
|
|
- getRequiredStorageTypes(requiredStorageTypes);
|
|
|
+ if (storageTypes == null) {
|
|
|
+ storageTypes = getRequiredStorageTypes(requiredStorageTypes);
|
|
|
+ }
|
|
|
if (LOG.isTraceEnabled()) {
|
|
|
LOG.trace("storageTypes=" + storageTypes);
|
|
|
}
|
|
@@ -453,7 +468,7 @@ public class BlockPlacementPolicyDefault extends BlockPlacementPolicy {
|
|
|
numOfReplicas = totalReplicasExpected - results.size();
|
|
|
return chooseTarget(numOfReplicas, writer, oldExcludedNodes, blocksize,
|
|
|
maxNodesPerRack, results, false, storagePolicy, unavailableStorages,
|
|
|
- newBlock);
|
|
|
+ newBlock, null);
|
|
|
}
|
|
|
|
|
|
boolean retry = false;
|
|
@@ -473,7 +488,7 @@ public class BlockPlacementPolicyDefault extends BlockPlacementPolicy {
|
|
|
numOfReplicas = totalReplicasExpected - results.size();
|
|
|
return chooseTarget(numOfReplicas, writer, oldExcludedNodes, blocksize,
|
|
|
maxNodesPerRack, results, false, storagePolicy, unavailableStorages,
|
|
|
- newBlock);
|
|
|
+ newBlock, null);
|
|
|
}
|
|
|
}
|
|
|
return writer;
|