Page 33 - 《软件学报》2021年第10期
P. 33
乔嘉林 等:基于着色 Petri 网的 HDFS 数据一致性建模与分析 3005
型的读文件回复(FileNotExist 变迁);如果文件存在,则通过 OpenFileGetReadLocations 查找名字节点中存储的文
件块和位置信息,生成读文件块请求和等待回复的读文件请求;ReadBlockSuccess 变迁根据读文件块回复更新
等待回复的读文件请求,如果已经获得了所有的回复,则组成读文件回复返回给上层应用.如果收到了失败的读
文件块回复,则触发 ReadBlockFail 变迁返回失败的读文件回复,同时产生等待回复的读文件请求在 FailedRead
ToMove 库所中,交给 RemoveReadAck 变迁删除后续到达的读文件块回复.
Fig.11 NamonodeRead model
图 11 NamenodeRead 模型
读操作流程中所有的变迁设置了特定的优先级,优先级均比写要高.这是为了模拟在写操作进行到任意步
骤时发起两次读操作请求的情况下,在写流程状态不再继续时(例如,模拟实际场景中写入负载过高导致写入延
迟过大)优先完成两次读操作.
3.4.3 OpenFileGetReadLocations 流程
OpenFileGetReadLocations 流程是根据文件名从名字节点获取文件块和存储位置的具体过程.该流程如图
12 所示,输入包括读文件请求(ReadFileRequest 库所)、第 1 关系映射(FileINode 库所)和第 2 关系映射(BlocksMap
库所).该流程的输出包括读文件块请求(ReadBlockRequest 库所)、等待回复的读文件请求(WaitingRFR 库所)和
读文件回复(ReadFileResponse 库所).中间结果包括正在查找文件块及位置的读文件请求(RFR_BLOCKS_
DATANODES 库所)、查找完全的文件块及位置的读文件请求(RFR_BLOCKS_DATANODES_FULL 库所).
主要流程如下:GetBlockList 变迁接收读文件请求,检查 FileINode 获取该文件的文件块列表,然后通过
GetLocFromBlocksMap 变迁从 BlocksMap 中逐个查找文件块列表中每个文件块的位置.如果在 BlocksMap 中没
有查到,并且正在查找的是正在构建的文件的最后一块,则触发 GetLocFromTargets 变迁将 FileINode 正在写入
的文件块所在数据节点列表中选取一个作为该文件块的存储位置.
通过上述查找过程后会产生 3 种结果:一是生成完整的包含所有文件块和位置的信息,则触发 HasAllLoc
变迁生成读文件块请求(对每一个文件块生成一个请求)和等待回复的读文件请求;第 2 种结果是没有查找到所
有文件块的位置,则触发 LocNotFound 变迁生成失败的读文件回复;第 3 种是文件为空,触发 NoBlock 变迁生成
失败的读文件回复.GenReadBlockRequest 变迁根据查找完全的文件块及位置的读文件请求生成等待回复的读
文件请求和读文件块请求.