dataserver 源码分析(三) 读写数据

超级块格式:

//|    reserve   |     SuperBlockInfo     |     {BlockIndex| ... |BlockIndex}    |

索引块格式:

//|     IndexHeader      |     common::FileInfoV2|common::FileInfoV2| ... |common::FileInfoV2  |

数据块格式:

//|     reserve      |      FileInfoInDiskExt + data|FileInfoInDiskExt + data| ... | FileInfoInDiskExt + data|

 

 

一、写数据

1、解析客户端请求包,如果本ds为本次写的master,从vector writable_中获取可写的WritableBlock,并从该writableBlock中获取blockId,servers,并产生block内的fileID,产生op_id,即lease_id。

2、将在该master上收到的写请求包,设置上面获取的block_id,file_id,lease_id,slave_flag等到请求包中,用于发往slave节点。

3、如果本节点为master,随即将message发往servers中的其他节点,并设置异步回调函数ds_async_callback。

4、获取索引文件中的blockinfoV2,校验版本号。写本地数据及计算crc校验码,

5、如果本节点是master,等待所有的写请求返回,并发送应答包。如果是slave节点,则返回应答包到maser节点。

6、当某一slave节点完成写操作后,会向master节点发送SlaveDsRespMessage应答包。而master节点收到应答包后继而调用上面设置的回调函数ds_async_callback进行更新该slave上的blockInfo,status等信息。

7、检查所有的slave节点都收到反馈了,发送writeFileRespMessageV2写数据应答包给外面的调用方。

至此,dataserver端写数据完成.

 

详见ClientRequestServer::write_file方法。

 

二、关闭文件:

1、收到close请求,首先将请求包立刻发送到slave节点,并设置回调函数ds_async_callback。

2、获取请求包中的crc,校验所关闭文件的crc是否一致

3、类似写数据的处理方式,作为master节点,需要等待其他slave节点的应答。如收到全部的slave节点应答,则向外发送关闭成功标志。

 

三、读数据

1、根据file_id,从索引文件中获取FileInfoV2,

2、根据block_id,获取逻辑块,根据offset获取物理块,从物理文件中读取数据返回。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值