addBlock()负责分配一个新的block以及该block备份存储的datanode。addBlock函数声明如下:
public LocatedBlock addBlock(String src, String clientName,DatanodeInfo[] excludedNodes)
其中src代表需要写入新block的文件;clientName代表写入该block的client、excludedNodes代表该block不能存储的datanode。
首先让我们思考一下addBlock应该如何实现。首先,我们需要修改src文件的INodeFile以便将新增block添加到INodeFile当中。因为INodeFile保存了最后一个Block存放的datanode,因此需要为新增的block分配datanode。下面我们看一下addBlock具体是怎么实现的。
在NameNode中,addBlock是通过FSNamesystem.getAdditionalBlock