HDFS-15227. NPE if the last block changes from COMMITTED to COMPLETE during FSCK. Contributed by Ayush Saxena.

This commit is contained in:
Ayush Saxena 2020-03-22 11:44:18 +05:30
parent b74e47e31a
commit 62c8015683

View File

@ -38,6 +38,7 @@
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.apache.hadoop.hdfs.server.blockmanagement.BlockUnderConstructionFeature;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceAudience;
@ -871,18 +872,22 @@ private void collectBlocksSummary(String parent, HdfsFileStatus file,
String blkName = block.toString(); String blkName = block.toString();
BlockInfo storedBlock = blockManager.getStoredBlock( BlockInfo storedBlock = blockManager.getStoredBlock(
block.getLocalBlock()); block.getLocalBlock());
DatanodeStorageInfo[] storages = storedBlock BlockUnderConstructionFeature uc =
.getUnderConstructionFeature().getExpectedStorageLocations(); storedBlock.getUnderConstructionFeature();
report.append('\n') if (uc != null) {
.append("Under Construction Block:\n") // BlockUnderConstructionFeature can be null, in case the block was
.append(blockNumber).append(". ").append(blkName) // in committed state, and the IBR came just after the check.
.append(" len=").append(block.getNumBytes()) DatanodeStorageInfo[] storages = uc.getExpectedStorageLocations();
report.append('\n').append("Under Construction Block:\n")
.append(blockNumber).append(". ").append(blkName).append(" len=")
.append(block.getNumBytes())
.append(" Expected_repl=" + storages.length); .append(" Expected_repl=" + storages.length);
String info=getReplicaInfo(storedBlock); String info = getReplicaInfo(storedBlock);
if (!info.isEmpty()){ if (!info.isEmpty()) {
report.append(" ").append(info); report.append(" ").append(info);
} }
} }
}
// count corrupt file & move or delete if necessary // count corrupt file & move or delete if necessary
if ((missing > 0) || (corrupt > 0)) { if ((missing > 0) || (corrupt > 0)) {