[
https://issues.apache.org/jira/browse/HDFS-15877?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Haiyang Hu updated HDFS-15877:
------------------------------
Description:
the related code is in BlockManager.java
{code:java}
// code placeholder
private boolean validateReconstructionWork(BlockReconstructionWork rw) {
BlockInfo block = rw.getBlock(); int priority = rw.getPriority(); // Recheck
since global lock was released // skip abandoned block or block reopened for
append if (block.isDeleted() || !block.isCompleteOrCommitted()) {
neededReconstruction.remove(block, priority); rw.resetTargets(); return false;
} // do not schedule more if enough replicas is already pending NumberReplicas
numReplicas = countNodes(block); final short requiredRedundancy =
getExpectedLiveRedundancyNum(block, numReplicas); final int pendingNum =
pendingReconstruction.getNumReplicas(block); if
(hasEnoughEffectiveReplicas(block, numReplicas, pendingNum)) {
neededReconstruction.remove(block, priority); rw.resetTargets();
blockLog.debug("BLOCK* Removing {} from neededReconstruction as" + " it has
enough replicas", block); return false; } DatanodeStorageInfo[] targets =
rw.getTargets(); BlockPlacementStatus placementStatus =
getBlockPlacementStatus(block); if ((numReplicas.liveReplicas() >=
requiredRedundancy) && (!placementStatus.isPlacementPolicySatisfied())) {
BlockPlacementStatus newPlacementStatus = getBlockPlacementStatus(block,
targets); if (!newPlacementStatus.isPlacementPolicySatisfied() &&
(newPlacementStatus.getAdditionalReplicasRequired() >=
placementStatus.getAdditionalReplicasRequired())) { // If the new targets do
not meet the placement policy, or at least // reduce the number of replicas
needed, then no use continuing. return false; } // mark that the reconstruction
work is to replicate internal block to a // new rack. rw.setNotEnoughRack(); //
Here to add resetTargets() }
{code}
was:
the related code is in BlockManager.java
{code:java}
// code placeholder
{code}
private boolean validateReconstructionWork(BlockReconstructionWork rw) {
BlockInfo block = rw.getBlock();
int priority = rw.getPriority();
// Recheck since global lock was released
// skip abandoned block or block reopened for append
if (block.isDeleted() || !block.isCompleteOrCommitted())
{ neededReconstruction.remove(block, priority); rw.resetTargets(); return
false; }
// do not schedule more if enough replicas is already pending
NumberReplicas numReplicas = countNodes(block);
final short requiredRedundancy =
getExpectedLiveRedundancyNum(block, numReplicas);
final int pendingNum = pendingReconstruction.getNumReplicas(block);
if (hasEnoughEffectiveReplicas(block, numReplicas, pendingNum)) {
neededReconstruction.remove(block, priority);
rw.resetTargets();
blockLog.debug("BLOCK* Removing {} from neededReconstruction as" +
" it has enough replicas", block);
return false;
}
DatanodeStorageInfo[] targets = rw.getTargets();
BlockPlacementStatus placementStatus = getBlockPlacementStatus(block);
if ((numReplicas.liveReplicas() >= requiredRedundancy) &&
(!placementStatus.isPlacementPolicySatisfied())) {
BlockPlacementStatus newPlacementStatus =
getBlockPlacementStatus(block, targets);
if (!newPlacementStatus.isPlacementPolicySatisfied() &&
(newPlacementStatus.getAdditionalReplicasRequired() >=
placementStatus.getAdditionalReplicasRequired()))
{ // If the new targets do not meet the placement policy, or at least // reduce
the number of replicas needed, then no use continuing. return false; }
// mark that the reconstruction work is to replicate internal block to a
// new rack.
rw.setNotEnoughRack(); // Here to add resetTargets()
}
> BlockReconstructionWork should resetTargets() before
> BlockManager#validateReconstructionWork return false
> ---------------------------------------------------------------------------------------------------------
>
> Key: HDFS-15877
> URL: https://issues.apache.org/jira/browse/HDFS-15877
> Project: Hadoop HDFS
> Issue Type: Improvement
> Reporter: Haiyang Hu
> Priority: Minor
>
> the related code is in BlockManager.java
> {code:java}
> // code placeholder
> private boolean validateReconstructionWork(BlockReconstructionWork rw) {
> BlockInfo block = rw.getBlock(); int priority = rw.getPriority(); // Recheck
> since global lock was released // skip abandoned block or block reopened for
> append if (block.isDeleted() || !block.isCompleteOrCommitted()) {
> neededReconstruction.remove(block, priority); rw.resetTargets(); return
> false; } // do not schedule more if enough replicas is already pending
> NumberReplicas numReplicas = countNodes(block); final short
> requiredRedundancy = getExpectedLiveRedundancyNum(block, numReplicas); final
> int pendingNum = pendingReconstruction.getNumReplicas(block); if
> (hasEnoughEffectiveReplicas(block, numReplicas, pendingNum)) {
> neededReconstruction.remove(block, priority); rw.resetTargets();
> blockLog.debug("BLOCK* Removing {} from neededReconstruction as" + " it has
> enough replicas", block); return false; } DatanodeStorageInfo[] targets =
> rw.getTargets(); BlockPlacementStatus placementStatus =
> getBlockPlacementStatus(block); if ((numReplicas.liveReplicas() >=
> requiredRedundancy) && (!placementStatus.isPlacementPolicySatisfied())) {
> BlockPlacementStatus newPlacementStatus = getBlockPlacementStatus(block,
> targets); if (!newPlacementStatus.isPlacementPolicySatisfied() &&
> (newPlacementStatus.getAdditionalReplicasRequired() >=
> placementStatus.getAdditionalReplicasRequired())) { // If the new targets do
> not meet the placement policy, or at least // reduce the number of replicas
> needed, then no use continuing. return false; } // mark that the
> reconstruction work is to replicate internal block to a // new rack.
> rw.setNotEnoughRack(); // Here to add resetTargets() }
> {code}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]