接下来看一下 processCommand(cmd),NameNode会返回那些指令,DataNode响应的动作。
final static int DNA_UNKNOWN = 0; // unknown action
final static int DNA_TRANSFER = 1; // transfer blocks to another datanode,在DataNode之间进行数据传输
final static int DNA_INVALIDATE = 2; // invalidate blocks,删除已经无效的数据
final static int DNA_SHUTDOWN = 3; // shutdown node,关闭DataNode
final static int DNA_REGISTER = 4; // re-register,DataNode向NameNode进行注册
final static int DNA_FINALIZE = 5; // finalize previous upgrade,提交已经完成的Update
final static int DNA_RECOVERBLOCK = 6; // request a block recovery,恢复一个block
final static int DNA_ACCESSKEYUPDATE = 7; // update access key,更新access key
final static int DNA_BALANCERBANDWIDTHUPDATE = 8; // update balancer bandwidth
具体的处理流程如下:
1、 case DatanodeProtocol.DNA_TRANSFER:
如果是DataNode之间传输数据,首选检查传输的块是否存在或者是否是处于创建的过程中,如果是想NN(NameNode)报告错误 notifyNamenode(DatanodeProtocol.INVALID_BLOCK, errStr);并返回。下一步判断DN上的真实数据大小是否小于NN记录的数据大小,如果是说明DN上记录的数据出现了问题,想NN报告错误, namenode.reportBadBlocks(....);并返回。最后启动一个专门用于DN之间数据传输的线程,new Daemon(new DataTransfer(xferTargets, block, this)).start();定义该线程的类是包含在DN类中的,后便的日志会单独进行介绍。
2、case DatanodeProtocol.DNA_INVALIDATE:
删除DN上的无效数据。
if (blockScanner != null) {
blockScanner.deleteBlocks(toDelete);
}
如果blockScanner存在,通知它 不要再扫描这些要删除的数据块,从磁盘上删除数据具体执行在 data.invalidate(toDelete);FSDataset中会进行介绍具体的过程。
3、 case DatanodeProtocol.DNA_SHUTDOWN:
当前的DataNode停止运行。该过程需要停止一系列的线程,包括httpserver、DN之间传输数据的ipcserver、client和DN之间传输数据的dataXceiverServer、 blockScannerThread、dataNodeThread等等。
4、case DatanodeProtocol.DNA_REGISTER:
如果NN失去了DN的数据要求DN进行重新连接。
5、 case DatanodeProtocol.DNA_FINALIZE:
版本升级结束。
6、 case UpgradeCommand.UC_ACTION_START_UPGRADE:
不太明白
7、case DatanodeProtocol.DNA_RECOVERBLOCK
有点晕没搞太清楚,待续。