HDFS-13027. Handle possible NPEs due to deleted blocks in race condition. Contributed by Vinayakumar B.
(cherry picked from commit 65977e5d81
)
This commit is contained in:
parent
f2c2a68ec2
commit
c36d69a7b3
|
@ -52,7 +52,7 @@ public abstract class BlockInfo extends Block
|
|||
/**
|
||||
* Block collection ID.
|
||||
*/
|
||||
private long bcId;
|
||||
private volatile long bcId;
|
||||
|
||||
/** For implementing {@link LightWeightGSet.LinkedElement} interface. */
|
||||
private LightWeightGSet.LinkedElement nextLinkedElement;
|
||||
|
|
|
@ -4171,6 +4171,10 @@ public class BlockManager implements BlockStatsMXBean {
|
|||
int numExtraRedundancy = 0;
|
||||
while(it.hasNext()) {
|
||||
final BlockInfo block = it.next();
|
||||
if (block.isDeleted()) {
|
||||
//Orphan block, will be handled eventually, skip
|
||||
continue;
|
||||
}
|
||||
int expectedReplication = this.getExpectedRedundancyNum(block);
|
||||
NumberReplicas num = countNodes(block);
|
||||
if (shouldProcessExtraRedundancy(num, expectedReplication)) {
|
||||
|
|
|
@ -4128,7 +4128,7 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
|
|||
while (it.hasNext()) {
|
||||
Block b = it.next();
|
||||
BlockInfo blockInfo = blockManager.getStoredBlock(b);
|
||||
if (blockInfo == null) {
|
||||
if (blockInfo == null || blockInfo.isDeleted()) {
|
||||
LOG.info("Cannot find block info for block " + b);
|
||||
} else {
|
||||
BlockCollection bc = getBlockCollection(blockInfo);
|
||||
|
|
|
@ -264,12 +264,13 @@ public class NamenodeFsck implements DataEncryptionKeyFactory {
|
|||
return;
|
||||
}
|
||||
|
||||
namenode.getNamesystem().readLock();
|
||||
try {
|
||||
//get blockInfo
|
||||
Block block = new Block(Block.getBlockId(blockId));
|
||||
//find which file this block belongs to
|
||||
BlockInfo blockInfo = blockManager.getStoredBlock(block);
|
||||
if(blockInfo == null) {
|
||||
if (blockInfo == null || blockInfo.isDeleted()) {
|
||||
out.println("Block "+ blockId +" " + NONEXISTENT_STATUS);
|
||||
LOG.warn("Block "+ blockId + " " + NONEXISTENT_STATUS);
|
||||
return;
|
||||
|
@ -329,6 +330,8 @@ public class NamenodeFsck implements DataEncryptionKeyFactory {
|
|||
out.println(e.getMessage());
|
||||
out.print("\n\n" + errMsg);
|
||||
LOG.warn("Error in looking up block", e);
|
||||
} finally {
|
||||
namenode.getNamesystem().readUnlock("fsck");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue