TFS 客户端源码分析(c++)
2014-09-03 16:58
204 查看
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_[]信息并插入缓存中,再次读取。
至此,读文件解析完毕。
一、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_[]信息并插入缓存中,再次读取。
至此,读文件解析完毕。
相关文章推荐
- BT客户端源码分析之一:总述
- 传奇源码分析-客户端(游戏逻辑处理源分析五 服务器端响应)
- 传奇源码分析-客户端(游戏逻辑处理源分析一)
- BT客户端源码分析之一:总述
- 短小精悍的C++单元测试框架CppUnitLite源码分析
- bt客户端源码分析之三: StorageWrapper 类
- BT客户端源码分析之四:PiecePicker 类(1)
- 传奇源码分析-客户端(传奇2文件格式分析)
- 传奇源码分析-客户端(游戏逻辑处理源分析五 服务器端响应)
- BT客户端源码分析之三(1):StorageWrapper 类
- 传奇源码分析-客户端(游戏逻辑处理源分析一)
- 传奇源码分析-客户端(传奇2文件格式分析)
- 传奇源码分析-客户端(全局变量与总体执行流程)
- 传奇源码分析-客户端(传奇2和3 文件格式分析比较)
- 传奇源码分析-客户端(游戏逻辑处理源分析二)
- BT客户端源码分析
- 传奇源码分析-客户端(WindHorn简述和传奇文件格式分析)
- 传奇源码分析-客户端(游戏逻辑处理源分析四)
- 传奇源码分析-客户端(全局变量与总体执行流程)
- BT客户端源码分析之三(2):StorageWrapper 类