Page 29 - 《软件学报》2021年第10期
P. 29
乔嘉林 等:基于着色 Petri 网的 HDFS 数据一致性建模与分析 3001
求(WriteBlockRequest 库所)和第 2 关系(BlocksMap 库所).既是输入又是输出的是租约(Lease 库所)和第 1 关系
(FileINode 库所).中间数据包括创建文件请求(CreateFile 库所)、获得后续文件块请求(GetFollowingBlock 库所)、
文件块计数器(BlockCounter 库所)和复合中间结果(WFB 库所).
Fig.6 OpenFileGetWriteLocations model
图 6 OpenFileGetWriteLocations 模型
主要流程为:根据写文件请求,生成创建文件的请求(IsCreateFile 变迁),如果该文件已经存在,生成创建失败
的结果返回(FileExist 变迁);否则检查并获取文件租约,在第 1 关系添加文件元数据(AddFile 变迁),生成获取后
续文件块请求,getAdditionalBlock 变迁负责处理获取文件块的请求,根据文件块计数器和第 1 关系,生成等待回
复的写文件请求、复合中间结果(更新第 1 关系的信息、更新第 2 关系的信息和写文件块请求),更新第 1 关系
的信息由 updateFileINode 变迁处理,更新第 2 关系的信息由 updateBlocksMap 变迁处理.写文件块请求由
genWriteBlockRequest 变迁处理.
3.2.4 DatanodeWrite 流程
DatanodeWrite 流程是客户端向数据节点上写文件块过程的建模.如图 7 所示,该流程的输入是写文件块请
求(WriteBlockRequest 库所),输出是写文件块回复(WriteBlockResponse 库所)、接收文件块通知(ReceivedBlock
库所)、更新数据节点存储的文件块(MergedBlock 库所).中间结果包括本地写文件块请求(WritingBlock 库所)、
未合并的文件块(UnmergedBlock 库所)、失败的写文件快回复(WriteLocalFail 库所)、更新写文件块回复
(WriteBlockAck 库所)、成功的写文件块回复(WriteLocalSuccess 库所).
主要流程为:
Receive 变迁的输入和输出相同,作为标识,ReceiveAndTransfer 变迁模拟需要写入的每个数据节点接
受到请求的行为(下文我们用“写入链”表示需要按需写入的数据节点链表).包括生成本地写文件块请
求(WritingBlock 库所)和发给下一节点的写文件块请求(WriteBlockRequest 库所).本地写入成功后会
产生一个通知名字节点接受文件块信息;
Fail 变迁模拟了本地写文件块失败的情况.写文件块回复(WriteBlockAck 库所)是写文件块过程中链条
下方的节点向上一节点发送的回复.genLastFAck 变迁处理写链条最后一个节点本地写失败的情况,直
接产生写文件块失败回复.genMidFAck 变迁用来生成失败的写文件块回复,包括中间节点的回复和写