千家信息网

MDSTable相关内容有哪些

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,这篇文章主要介绍MDSTable相关内容有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!对MDSTable的操作主要是对version和state保存到集群以及从集群中读取
千家信息网最后更新 2025年12月02日MDSTable相关内容有哪些

这篇文章主要介绍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 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 snaps;

map> need_to_purge;

map pending_update;

map> pending_destroy;

set 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> 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相关内容有哪些"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

0