|
@@ -142,7 +142,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
|
|
@@ -194,7 +203,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]);
|
|
|
}
|
|
@@ -244,7 +254,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;
|
|
|
}
|
|
@@ -282,7 +293,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;
|
|
@@ -292,7 +303,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) {
|
|
@@ -372,6 +384,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,
|
|
@@ -383,7 +396,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;
|
|
|
}
|
|
@@ -401,8 +415,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);
|
|
|
}
|
|
@@ -445,7 +460,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;
|
|
@@ -465,7 +480,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;
|