|
@@ -81,6 +81,9 @@ class UnderReplicatedBlocks implements Iterable<Block> {
|
|
|
private final List<LightWeightLinkedSet<Block>> priorityQueues
|
|
|
= new ArrayList<LightWeightLinkedSet<Block>>(LEVEL);
|
|
|
|
|
|
+ /** The number of corrupt blocks with replication factor 1 */
|
|
|
+ private int corruptReplOneBlocks = 0;
|
|
|
+
|
|
|
/** Create an object. */
|
|
|
UnderReplicatedBlocks() {
|
|
|
for (int i = 0; i < LEVEL; i++) {
|
|
@@ -122,6 +125,11 @@ class UnderReplicatedBlocks implements Iterable<Block> {
|
|
|
return priorityQueues.get(QUEUE_WITH_CORRUPT_BLOCKS).size();
|
|
|
}
|
|
|
|
|
|
+ /** Return the number of corrupt blocks with replication factor 1 */
|
|
|
+ synchronized int getCorruptReplOneBlockSize() {
|
|
|
+ return corruptReplOneBlocks;
|
|
|
+ }
|
|
|
+
|
|
|
/** Check if a block is in the neededReplication queue */
|
|
|
synchronized boolean contains(Block block) {
|
|
|
for(LightWeightLinkedSet<Block> set : priorityQueues) {
|
|
@@ -183,6 +191,10 @@ class UnderReplicatedBlocks implements Iterable<Block> {
|
|
|
int priLevel = getPriority(block, curReplicas, decomissionedReplicas,
|
|
|
expectedReplicas);
|
|
|
if(priorityQueues.get(priLevel).add(block)) {
|
|
|
+ if (priLevel == QUEUE_WITH_CORRUPT_BLOCKS &&
|
|
|
+ expectedReplicas == 1) {
|
|
|
+ corruptReplOneBlocks++;
|
|
|
+ }
|
|
|
if(NameNode.blockStateChangeLog.isDebugEnabled()) {
|
|
|
NameNode.blockStateChangeLog.debug(
|
|
|
"BLOCK* NameSystem.UnderReplicationBlock.add:"
|
|
@@ -205,7 +217,16 @@ class UnderReplicatedBlocks implements Iterable<Block> {
|
|
|
int priLevel = getPriority(block, oldReplicas,
|
|
|
decommissionedReplicas,
|
|
|
oldExpectedReplicas);
|
|
|
- return remove(block, priLevel);
|
|
|
+ boolean removedBlock = remove(block, priLevel);
|
|
|
+ if (priLevel == QUEUE_WITH_CORRUPT_BLOCKS &&
|
|
|
+ oldExpectedReplicas == 1 &&
|
|
|
+ removedBlock) {
|
|
|
+ corruptReplOneBlocks--;
|
|
|
+ assert corruptReplOneBlocks >= 0 :
|
|
|
+ "Number of corrupt blocks with replication factor 1 " +
|
|
|
+ "should be non-negative";
|
|
|
+ }
|
|
|
+ return removedBlock;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -299,6 +320,18 @@ class UnderReplicatedBlocks implements Iterable<Block> {
|
|
|
+ " at priority level " + curPri);
|
|
|
}
|
|
|
}
|
|
|
+ if (oldPri != curPri || expectedReplicasDelta != 0) {
|
|
|
+ // corruptReplOneBlocks could possibly change
|
|
|
+ if (curPri == QUEUE_WITH_CORRUPT_BLOCKS &&
|
|
|
+ curExpectedReplicas == 1) {
|
|
|
+ // add a new corrupt block with replication factor 1
|
|
|
+ corruptReplOneBlocks++;
|
|
|
+ } else if (oldPri == QUEUE_WITH_CORRUPT_BLOCKS &&
|
|
|
+ curExpectedReplicas - expectedReplicasDelta == 1) {
|
|
|
+ // remove an existing corrupt block with replication factor 1
|
|
|
+ corruptReplOneBlocks--;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|