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 变迁根据查找完全的文件块及位置的读文件请求生成等待回复的读
                 文件请求和读文件块请求.
   28   29   30   31   32   33   34   35   36   37   38