文档章节

MDSTable相关内容分析

linuxhunter
 linuxhunter
发布于 2016/07/06 09:20
字数 1137
阅读 202
收藏 1

对MDSTable的操作主要是对version和state保存到集群以及从集群中读取的操作。具体操作处理函数说明如下:

MDSTable::save()

|__对version和state进行encode操作

|__设置committing_version = version          设置committing_version

|__设置waitfor_save[version].push_back(onfinish)

|__get_object_name()          得到对象名称mds_${table_name}

|__得到object_locator_t类实例,即:将数据存放到metadata pool中

|__mds->object_write_full()     将version和state的encode数据写入到metadata pool中的mds_${table_name}对象中

 

MDSTable::save_2()

|__committed_version = v          设置committed_version

|__遍历waitfor_save数组

     |__对于waitfor_save[i]->first <=v的,从waitfor_save数组中删除     

 

MDSTable::reset()

|__reset_state()     

|__state = STATE_ACTIVE          设置state当前值

 

MDSTable::load()

|__state = STATE_OPENING          设置state当前值

|__get_object_name()          得到对象名称mds_${table_name}

|__得到object_locator_t类实例,即:将数据存放到metadata pool中

|__mds->objecter->read_full()     从集群中获取MDSTable信息

 

MDSTable::load_2()

|__state = STATE_ACTIVE

|__若r == -EBLACKLISTED,则调用mds->respawn()

|__若r < 0,则调用mds->damaged()

|__从集群的得到version值且设置projected_version=committed_version=version

|__从集群中得到state信息

 

MDSTableServer类继承MDSTable类

class MDSTableServer : public MDSTable {

     int table;

     map<version_t,mds_table_pending_t> pending_for_mds;      记录对mds操作未完成的信息

};

 

MDSTableServer::handle_request()          总路由调度函数,负责将请求分派给不同的handle_*()来处理

|__TABLESERVER_OP_QUERY

     |__handle_query()

|__TABLESERVER_OP_PREPARE

     |__handle_prepare()

|__TABLESERVER_OP_COMMIT

     |__handle_commit()

|__TABLESERVER_OP_ROLLBACK

     |__handle_rollback()

 

MDSTableServer::handle_prepare()

|___prepare()               调用子类的_prepare()函数从request消息中得到具体的信息

|___note_prepare()      填充pending_for_mds数组

|__创建ETableServer类对象

|__mds->mdlog->submit_entry()               写log

|__mds->mdlog->flush()     

 

MDSTableServer::_prepare_logged()     该函数是handle_prepare()执行完写log后的回调函数

|__创建MMDSTableRequest类消息(TABLESERVER_OP_AGREE)

|__mds->send_message_mds()          将类消息发送回给调用handle_prepare()的对端

 

MDSTableServer::handle_commit()

|__检查pending_for_mds数组中是否包含对应的项

     |___commit()          执行子类的commit操作

     |___note_commit()     删除pending_for_mds数组中对应的项

     |__mds->mdlog->start_submit_entry()          写log

 

MDSTableServer::_commit_logged()          该函数是handle_commit()执行完写log后的回调函数

|__创建MMDSTableRequest类消息(TABLESERVER_OP_ACK)

|__mds->send_message_mds()          将类消息发送回给调用handle_prepare()的对端

 

MDSTableServer::handle_rollback()

|___rollback()          执行子类的rollback操作

|___note_rollback()     删除pending_for_mds数组中对应的项

|___mds->mdlog->start_submit_entry()          写log

 

MDSTableServer::do_server_update()

|__创建ETableServer类实例

|__mds->mdlog->start_entry()               

|__mds->mdlog->submit_entry()           写log

 

MDSTableServer::finish_recovery()

|__遍历参数中的mds_rank_t集合

     |__handle_mds_recovery()

 

MDSTableServer::handle_mds_recovery()

|__遍历pending_for_mds数组

     |__创建MMDSTableRequest类消息(TABLESERVER_OP_AGREE)

     |__mds->send_message_mds()               发送mds消息

|__创建MMDSTableRequest类消息(TABLESERVER_OP_SERVER_READY)

|__mds->send_message_mds()                    发送mds消息

 

SnapServer类继承于MDSTableServer,用来记录需要进行Snap操作的相关信息

class SnapServer: public MDSTableServer {

     MonClient *mon_client;          与monitor交互的client端

     snapid_t last_snap;               

     map<snapid_t, SnapInfo> snaps;

     map<int, set<snapid_t>> need_to_purge;

     map<version_t, SnapInfo> pending_update;

     map<version_t, pair<snapid_t, snapid_t>> pending_destroy;

     set<version_t> pending_noop;

     version_t last_checked_osdmap;

};

 

SnapServer::reset_state()                    清空snaps和need_to_purge这两个数组,之后获取last_snap值

|__设置last_snap=1

|__清除snaps和need_to_purge数组

|__遍历mds使用的osdmap

     |__遍历mdsmap使用的所有data pools

          |__从osdmap中得到data pool对应的pg_pool_t结构

          |__对于pg_pool_t结构中removed_snaps数组不为空,则取removed_snaps.range_end()最大值

|__设置last_snap = removed_snaps.range_end()的最大值

 

SnapServer::_prepare()

|__TABLE_OP_CREATE

     |__更新version值(version++)

     |__从参数bufferlist中得到SnapInfo信息(ino/name/stamp)

     |__设置SnapInfo的snapid = ++last_snap/long_name=“create"

     |__更新pending_update[version] = info

|__TABLE_OP_DESTROY

     |__从参数bufferlist中得到inodeno_t和snapid_t的值

     |__更新version值和last_snap值(version++/++last_snap)

     |__更新pending_destroy[version]数组

|__TABLE_OP_UPDATE

     |__从参数bufferlist中得到SnapInfo信息(ino/snapid/name/stamp)

     |__更新version值和last_snap值(version++/++last_snap)

     |__更新pending_update[version] = info

 

SnapServer::_is_prepared()

|__判断pending_update或pending_destroy数组中是否包含参数指定的tid

 

SnapServer::_commit()

|__待commit的tid在pending_update数组中

     |__从pending_update数组中得到指定tid的SnapInfo值

     |__更新snaps[info.snapid] = info

     |__删除pending_update[tid]

|__待commit的tid在pending_destroy数组中

     |__从pending_destroy数组中得到指定tid对应的snapid和last_snapid

     |__从snaps数组中删除snapid对应的值

     |__遍历mdsmap所有的data pools

          |__更新need_to_purge数组(need_to_purge[*p].insert(snapid)/need_to_purge[*p].insert(last_snapid)

     |__删除pending_destroy[tid]

|__更新version (version++)

 

SnapServer::_rollback()

|__在pending_update/pending_destroy数组中删除掉指定tid的值

 

SnapServer::_server_update()

|__从参数bufferlist中得到map<int, vector<snapid_t>> purge值

|__遍历purge

     |__删除need_to_purge中指定的内容

|__更新version

 

SnapServer::check_osd_map()

|__遍历mds对应的所有osdmap

     |__遍历need_to_purge数组

          |__从osdmap中得到pg_pool_t数据结构的值

          |__若pg_pool_t为空,则设置all_purged[id] = need_to_purge[id].all

          |__遍历need_to_purge数组的第二个参数

               |__若pg_pool_t->is_removed_snap(i),则设置all_purged[id].push_back(i),否则设置all_purge[id].push_back(i)

|__对于all_purged数组不为空

     |__将all_purged数组序列化

     |__MDSTableServer::do_server_update()

          |__SnapServer::_server_update()

          |__创建ETableServer类对象

          |__mds->mdlog->start_entry()

          |__mds->mdlog->submit_entry()          写log

|__对于all_purge数组不为空

     |__创建MRemoveSnaps类消息

     |__mon_client->send_mon_message()     将消息发送给monitor来删除对应的snaps

 

MDSTable/MDSTableServer/SnapServer之间的关系如下图所示:

© 著作权归作者所有

linuxhunter
粉丝 72
博文 144
码字总数 93264
作品 0
沈阳
高级程序员
私信 提问
MDSRank类解析

MDSRank与MDSDaemon一起构成了MDS进程的核心处理类。 =====================MDSRankDispatcher相关========================= MDSRankDispatcher是MDSRank与MDSDaemon的接口类,MDSRankDisp......

linuxhunter
2016/07/08
808
0
Python数据分析学习路径图(120天Get新技能)

Python是一种面向对象、直译式计算机程序设计语言,由Guido van Rossum于1989年底发明。由于他简单、易学、免费开源、可移植性、可扩展性等特点,Python又被称之为胶水语言。下图为主要程序语...

数据007
2016/01/22
0
0
2017/05/02工作日志

上午: 1.与孙琦办理入职相关手续,了解相关规定内容; 2.听博哥讲解公司内部团队结构,质监局项目,工会项目,公司使用相关技术说明等 3.看质监局标准化院项目的需求文档,听宇哥讲解有关项目...

李华东
2017/05/02
1
0
分析师做竞品分析的正确姿势

市面上介绍怎么做竞品分析的文章多是以产品经理的视角进行,那么以数据分析师的视角做竞品分析该如何呢?以市场经理的视角做竞品分析又该如何呢?不同的身份视角,对应的是分析目的的不同。 ...

数据007
2016/05/25
0
0
【源码】otter工程结构

最近在搞数据同步相关的内容,需要对otter的代码进行扩展,所以需要先熟悉一下otter的源码。首先我们整体来看下otter的工程结构。otter的工程结构比较复杂,需要花费一定的时间来理解各个部分...

端木轩
2018/01/22
71
0

没有更多内容

加载失败,请刷新页面

加载更多

关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
今天
6
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
6
0
Docker容器实战(七) - 容器中进程视野下的文件系统

前两文中,讲了Linux容器最基础的两种技术 Namespace 作用是“隔离”,它让应用进程只能看到该Namespace内的“世界” Cgroups 作用是“限制”,它给这个“世界”围上了一圈看不见的墙 这么一...

JavaEdge
今天
8
0
文件访问和共享的方法介绍

在上一篇文章中,你了解到文件有三个不同的权限集。拥有该文件的用户有一个集合,拥有该文件的组的成员有一个集合,然后最终一个集合适用于其他所有人。在长列表(ls -l)中这些权限使用符号...

老孟的Linux私房菜
今天
7
0
面试套路题目

作者:抱紧超越小姐姐 链接:https://www.nowcoder.com/discuss/309292?type=3 来源:牛客网 面试时候的潜台词 抱紧超越小姐姐 编辑于 2019-10-15 16:14:56APP内打开赞 3 | 收藏 4 | 回复24 ...

MtrS
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部