TFS 客户端源码分析(c++)

来源:互联网 发布:单片机波形发生器程序 编辑:程序博客网 时间:2024/06/05 23:46

TFS中客户端RcClient类作为用户交互类。(clientv2)

一、initialize方法,提供初始化客户端,向rc申请app_id等一系列信息

1、开启Transport,接受读写事件。创建connectionManager对象,并设置NewClientManager类为客户端请求回复包回调接口。初始化成功。

2、调用login方法。根据app_key,app_ip(本地ip)向rc获取session_id(session_id可以解析出app_id),base_info(包含了集群的信息,以及集群中的ns_vip等等)。然后循环获取集群信息中的ns_vip,并将ns_vip设置到write_ns_[3]与read_ns_[3]中,用于读写。登陆rc server并获取信息完成。

3、为支持自定义文件名特性,根据设置进来的rs_addr,向rs(rootserver)获取KvMetaTable。

 

二、save_buf方法,提供写数据接口

1、从initialize中设置的write_ns_[3]中获取ns_addr。

2、调用TfsClientImpV2::save_buf_ex方法。内部分为open,write,close三个阶段。

open方法:

3、以写方式调用open时,第一个参数file_name置NULL。获取全局递增的fd。根据ns_addr从session_pool中获取TfsSession。向nameserver获取clustConfig,ds_table等信息设置到TfsSession中。

4、新建TfsFile对象,调用open函数,从ds_table[]中随即获取一个server设置到TfsFile中。将fd与TfsFile的映射加入map中。

write方法:

5、根据open时获取的fd,从map中找到TfsFile对象并调用write函数。发送写请求包,并从回复包中获取lease_id,block_id,file_id更新到TfsFile中。如果写入成功,则计算crc校验码保存。

close方法:

6、调用TfsClose的close方法。内部发送关闭请求,并返回回复包状态。返回成功则更新stat_mgr中的状态。更新ds_table[]。

以上就是完整的写流程

 

三、读文件

read方法:

1、读文件时,需要找到blockid->ds_[]的对应关系,以便读取数据。在以读打开文件时,会从TfsSession中缓存的block->ds_[]中查找,找不到则从ns获取并把它插入TfsSession的缓存中。

2、read时获取该file对应的vector_ds_,如从一个ds读取失败则从下一个继续尝试读取。

3、发送读文件请求包,每次读取1M数据,获取回复包中的buf及长度。由于可能存在block被迁移到其他dataserver上,而open时的映射关系可能已过时。这样读取时就会返回NO_LOGICBLOCK错误,这时需要移除缓存中的映射记录。

4、如果读取失败且命中缓存记录,说明缓存中的记录已过时,需要重新读取数据。清除file中的ds_[],重新从ns获取ds_[]信息并插入缓存中,再次读取。

至此,读文件解析完毕。

0 0
原创粉丝点击