@Override // DatanodeProtocol
  public DatanodeCommand blockReport(DatanodeRegistration nodeReg, String poolId, long[] blocks)
      throws IOException {
    verifyRequest(nodeReg);
    BlockListAsLongs blist = new BlockListAsLongs(blocks);
    if (stateChangeLog.isDebugEnabled()) {
      stateChangeLog.debug(
          "*BLOCK* NameNode.blockReport: "
              + "from "
              + nodeReg.getName()
              + " "
              + blist.getNumberOfBlocks()
              + " blocks");
    }

    namesystem.getBlockManager().processReport(nodeReg, poolId, blist);
    if (nn.getFSImage().isUpgradeFinalized()) return new DatanodeCommand.Finalize(poolId);
    return null;
  }
 private void verifySoftwareVersion(DatanodeRegistration dnReg) throws IncorrectVersionException {
   String dnVersion = dnReg.getSoftwareVersion();
   if (VersionUtil.compareVersions(dnVersion, minimumDataNodeVersion) < 0) {
     IncorrectVersionException ive =
         new IncorrectVersionException(minimumDataNodeVersion, dnVersion, "DataNode", "NameNode");
     LOG.warn(ive.getMessage() + " DN: " + dnReg);
     throw ive;
   }
   String nnVersion = VersionInfo.getVersion();
   if (!dnVersion.equals(nnVersion)) {
     String messagePrefix =
         "Reported DataNode version '"
             + dnVersion
             + "' of DN "
             + dnReg
             + " does not match NameNode version '"
             + nnVersion
             + "'";
     long nnCTime = nn.getFSImage().getStorage().getCTime();
     long dnCTime = dnReg.getStorageInfo().getCTime();
     if (nnCTime != dnCTime) {
       IncorrectVersionException ive =
           new IncorrectVersionException(
               messagePrefix
                   + " and CTime of DN ('"
                   + dnCTime
                   + "') does not match CTime of NN ('"
                   + nnCTime
                   + "')");
       LOG.warn(ive);
       throw ive;
     } else {
       LOG.info(messagePrefix + ". Note: This is normal during a rolling upgrade.");
     }
   }
 }