Page 30 - 《软件学报》2021年第10期
P. 30
3002 Journal of Software 软件学报 Vol.32, No.10, October 2021
入链第 1 个节点的回复.该变迁的输入是本地失败的写文件回复(WriteLocalFail 库所)和下游节点的写
文件块回复.isFirstAck 变迁将 WriteBlockAck 库所中第 1 个数据节点的回复转移到 WriteBlock
ResponseOut 库所中,作为返回给客户端的输出;
Success 变迁表示成功执行本地写入,产生未合并的文件块.由于一个文件块可能由多次写文件的请求
的数据拼接而成,AddNew 和 Merge 变迁共同完成文件块的新增或合并过程.genLastSAck 变迁处理写
入链最后一个节点的情况,并通知名字节点存储成功.genMidSAck 变迁处理中间节点接收到写入链下
游成功回复的情况,向写入链上游返回成功的回复.genMidFAck2 变迁处理本地写成功但写入链下游
节点写失败的情况,返回失败的回复给写入链上游节点.
Fig.7 DatanodeWrite model
图 7 DatanodeWrite 模型
3.2.5 ProcessWriteBlockResult 流程
ProcessWriteBlockResult 流程是处理写文件块回复的流程,如图 8 所示,输入是 DatanodeWrite 流程返回的
写文件块回复(WriteBlockResponse 库所),输出是写文件回复(WriteFileResponse 库所),既是输入又是输出的是
等待回复的写文件请求(WaitWriteFile 库所)、租约(Lease 库所)和第 1 关系(FileINode 库所).中间数据包括需要
删除的写文件块请求(FailedWriteToRemove)、失败的写文件请求(FailedWrite 库所)和成功的写文件请求
(WriteFileSuccess 库所).一个文件通常包括一个或多个文件块,所以一个写文件请求会生成一个或多个写文件
块请求,每次成功的写文件请求会等待所有写文件块请求都返回成功才可以返回,但一旦出现失败的写文件块
回复,就可以直接返回失败的写文件回复.
主要流程为:获得写文件块回复和等待回复的写文件请求,如果是成功的写文件块回复,WriteFileSuccess 变
迁会更新已经接受到的回复数量(WaitWriteFile 库所).如果回复的数量等于等待回复的数量,且所有回复都是成
功的,则产生成功的写文件请求.WriteFileFail 变迁处理失败的写文件块回复:删除 WaitWriteFile 库所中的令牌,
停止等待;输出到 FailedWrite 库所,进入失败写操作的处理流程;输出到 FailedWriteToRemove 库所,作为该文件
写失败的标记.SuccessCloseFile 和 FailCloseFile 变迁处理成功和失败的写文件块回复.其输出包括:删除客户端
对该文件持有的租约;修改文件状态 FileINode.产生成功或失败的写文件回复,输出到 WriteFileResponse 库所.