MDSTable相关内容有哪些

发布时间:2021-12-18 16:55:35 作者:小新
来源:亿速云 阅读:80

这篇文章主要介绍MDSTable相关内容有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

对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之间的关系如下图所示:

MDSTable相关内容有哪些

以上是“MDSTable相关内容有哪些”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!

推荐阅读:
  1. Zookeeper相关内容及简单理解、安装
  2. Linux命令:MySQL系列之八--MySQL事务相关内容

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

上一篇:Android解决图片大量下载的方法是什么

下一篇:如何进行springboot配置templates直接访问的实现

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》