diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/LeaseManager.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/LeaseManager.java index 1e7a17402f..31fb2bb284 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/LeaseManager.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/LeaseManager.java @@ -144,7 +144,15 @@ synchronized long getNumUnderConstructionBlocks() { + "acquired before counting under construction blocks"; long numUCBlocks = 0; for (Long id : getINodeIdWithLeases()) { - final INodeFile cons = fsnamesystem.getFSDirectory().getInode(id).asFile(); + INode inode = fsnamesystem.getFSDirectory().getInode(id); + if (inode == null) { + // The inode could have been deleted after getINodeIdWithLeases() is + // called, check here, and ignore it if so + LOG.warn("Failed to find inode {} in getNumUnderConstructionBlocks().", + id); + continue; + } + final INodeFile cons = inode.asFile(); if (!cons.isUnderConstruction()) { LOG.warn("The file {} is not under construction but has lease.", cons.getFullPathName()); @@ -155,10 +163,11 @@ synchronized long getNumUnderConstructionBlocks() { continue; } for(BlockInfo b : blocks) { - if(!b.isComplete()) + if(!b.isComplete()) { numUCBlocks++; } } + } LOG.info("Number of blocks under construction: {}", numUCBlocks); return numUCBlocks; }