|
@@ -234,9 +234,10 @@ public class BlockPlacementPolicyDefault extends BlockPlacementPolicy {
|
|
|
DatanodeDescriptor favoredNode = favoredNodes.get(i);
|
|
|
// Choose a single node which is local to favoredNode.
|
|
|
// 'results' is updated within chooseLocalNode
|
|
|
- final DatanodeStorageInfo target =
|
|
|
- chooseLocalStorage(favoredNode, favoriteAndExcludedNodes, blocksize,
|
|
|
- maxNodesPerRack, results, avoidStaleNodes, storageTypes, false);
|
|
|
+ final DatanodeStorageInfo target = chooseLocalOrFavoredStorage(
|
|
|
+ favoredNode, true, favoriteAndExcludedNodes, blocksize,
|
|
|
+ maxNodesPerRack, results, avoidStaleNodes, storageTypes);
|
|
|
+
|
|
|
if (target == null) {
|
|
|
LOG.warn("Could not find a target for file " + src
|
|
|
+ " with favored node " + favoredNode);
|
|
@@ -545,16 +546,41 @@ public class BlockPlacementPolicyDefault extends BlockPlacementPolicy {
|
|
|
List<DatanodeStorageInfo> results, boolean avoidStaleNodes,
|
|
|
EnumMap<StorageType, Integer> storageTypes)
|
|
|
throws NotEnoughReplicasException {
|
|
|
+ return chooseLocalOrFavoredStorage(localMachine, false,
|
|
|
+ excludedNodes, blocksize, maxNodesPerRack, results, avoidStaleNodes,
|
|
|
+ storageTypes);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Choose storage of local or favored node.
|
|
|
+ * @param localOrFavoredNode local or favored node
|
|
|
+ * @param isFavoredNode if target node is favored node
|
|
|
+ * @param excludedNodes datanodes that should not be considered as targets
|
|
|
+ * @param blocksize size of the data to be written
|
|
|
+ * @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 storage of local or favored node (not chosen node)
|
|
|
+ * @throws NotEnoughReplicasException
|
|
|
+ */
|
|
|
+ protected DatanodeStorageInfo chooseLocalOrFavoredStorage(
|
|
|
+ Node localOrFavoredNode, boolean isFavoredNode, Set<Node> excludedNodes,
|
|
|
+ long blocksize, int maxNodesPerRack, List<DatanodeStorageInfo> results,
|
|
|
+ boolean avoidStaleNodes, EnumMap<StorageType, Integer> storageTypes)
|
|
|
+ throws NotEnoughReplicasException {
|
|
|
// if no local machine, randomly choose one node
|
|
|
- if (localMachine == null) {
|
|
|
+ if (localOrFavoredNode == null) {
|
|
|
return chooseRandom(NodeBase.ROOT, excludedNodes, blocksize,
|
|
|
maxNodesPerRack, results, avoidStaleNodes, storageTypes);
|
|
|
}
|
|
|
- if (preferLocalNode && localMachine instanceof DatanodeDescriptor
|
|
|
- && clusterMap.contains(localMachine)) {
|
|
|
- DatanodeDescriptor localDatanode = (DatanodeDescriptor) localMachine;
|
|
|
+ if ((preferLocalNode || isFavoredNode)
|
|
|
+ && localOrFavoredNode instanceof DatanodeDescriptor
|
|
|
+ && clusterMap.contains(localOrFavoredNode)) {
|
|
|
+ DatanodeDescriptor localDatanode =
|
|
|
+ (DatanodeDescriptor) localOrFavoredNode;
|
|
|
// otherwise try local machine first
|
|
|
- if (excludedNodes.add(localMachine) // was not in the excluded list
|
|
|
+ if (excludedNodes.add(localOrFavoredNode) // was not in the excluded list
|
|
|
&& isGoodDatanode(localDatanode, maxNodesPerRack, false,
|
|
|
results, avoidStaleNodes)) {
|
|
|
for (Iterator<Map.Entry<StorageType, Integer>> iter = storageTypes
|
|
@@ -574,7 +600,7 @@ public class BlockPlacementPolicyDefault extends BlockPlacementPolicy {
|
|
|
return localStorage;
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
+ }
|
|
|
}
|
|
|
return null;
|
|
|
}
|