[ https://issues.apache.org/jira/browse/HDFS-6577?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Arpit Agarwal resolved HDFS-6577. --------------------------------- Resolution: Not a Problem Resolving, feel free to respond if you disagree. > Failure to create FinalizeCommand > --------------------------------- > > Key: HDFS-6577 > URL: https://issues.apache.org/jira/browse/HDFS-6577 > Project: Hadoop HDFS > Issue Type: Bug > Components: namenode > Affects Versions: 2.4.0 > Reporter: Yongjun Zhang > Assignee: Yongjun Zhang > > I visually see a bug in NameNodeRpcServer.java, > {code} > @Override // DatanodeProtocol > public DatanodeCommand blockReport(DatanodeRegistration nodeReg, > String poolId, StorageBlockReport[] reports) throws IOException { > verifyRequest(nodeReg); > if(blockStateChangeLog.isDebugEnabled()) { > blockStateChangeLog.debug("*BLOCK* NameNode.blockReport: " > + "from " + nodeReg + ", reports.length=" + reports.length); > } > final BlockManager bm = namesystem.getBlockManager(); > boolean noStaleStorages = false; > for(StorageBlockReport r : reports) { > final BlockListAsLongs blocks = new BlockListAsLongs(r.getBlocks()); > noStaleStorages = bm.processReport(nodeReg, r.getStorage(), poolId, > blocks); > metrics.incrStorageBlockReportOps(); > } > if (nn.getFSImage().isUpgradeFinalized() && > !nn.isStandbyState() && > noStaleStorages) { > return new FinalizeCommand(poolId); > } > return null; > } > {code} > noStaleStorage is initialized to false, then in the for loop {{ > for(StorageBlockReport r : reports) {}} it could be changed to true. > The problem is, since it's a loop of all reports, the value returned from the > last blockreport (the last iteration) will set it to the final value. Even if > it was set to true in the middle of a loop, the final iteration could > overwrite it to false. Similarly, if it was set to false in the middle, and > the final iter could overwrite it to true. -- This message was sent by Atlassian JIRA (v6.2#6252)