|
@@ -145,7 +145,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
|
|
@@ -197,7 +206,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]);
|
|
|
}
|
|
@@ -247,7 +257,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;
|
|
|
}
|
|
@@ -283,7 +294,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;
|
|
@@ -293,7 +304,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) {
|
|
@@ -373,6 +385,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,
|
|
@@ -384,7 +397,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;
|
|
|
}
|
|
@@ -402,8 +416,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);
|
|
|
}
|
|
@@ -446,7 +461,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;
|
|
@@ -466,7 +481,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;
|