在《Hadoop-2.4.1源码分析--HDFS HeartBeat(心跳检测)之DataNode端数据块增量汇报》中,介绍了在DN中调用NN的代理实例bpNamenode的blockReceivedAndDeleted()方法,由它负责向NamNode发送RPC请求,根据我们之前讲的RPC原理,可以得知在NN端必定也有一个blockReceivedAndDeleted()方法,执行具体的RPC请求。而NameNode对应RPC请求处理的方法在NameNodeRpcServer类中的blockReceivedAndDeleted()方法,代码如下:
进入FSNamesystem的processIncrementalBlockReport()方法:
可以看见,FSNamesystem的processIncrementalBlockReport()方法是典型的一个写锁模式,获取写锁,try模块中处理业务逻辑,finally模块中释放写锁。而业务逻辑的处理,则是通过调用BlockManager的processIncrementalBlockReport()方法来完成的。FSNamesystem相当于名字节点NameNod代理模式中的代理,由它负责一切文件系统操作相关的处理。而BlockManager则是名字节点NameNode中针对所有block状态保持、变更处理等的具体处理方法的实现。
进入BlockManager的processIncrementalBlockReport()方法,代码如下:
整个逻辑非常清晰,不在赘述。