千家信息网

MDSDaemon的示例分析

发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇文章主要介绍了MDSDaemon的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。MDSDaemon和MDSRank一起形成
千家信息网最后更新 2025年02月02日MDSDaemon的示例分析

这篇文章主要介绍了MDSDaemon的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

MDSDaemon和MDSRank一起形成了MDS进程核心架构,本文只描述MDSDaemon部分,MDSRank部分后面会讲述。

MDSDaemon::asok_command()

|__对于command == "status"

|__MDSDaemon::dump_status() 打印mds状态信息

|__对于command != "status"且mds_rank != NULL

|__MDSRank::handle_asok_command() 由MDSRank类来处理command请求

MDSDaemon::set_up_admin_socket()

|__创建AdminSocket类实例

|__创建MDSSocketHook类实例

|__调用AdminSocket->register_command()来注册MDSDaemon支持的命令

MDSDaemon::init()

|__Objecter::init()

|__设置objecter/beacon/mdsdaemon可以进行消息分发和处理

|__设置monclient的messenger

|__MonClient::init() 初始化monclient

|__设置monclient的log信息

|__MonClient::authenticate() 向monitor进行认证

|__Objecter::start() 启动Objecter

|__MonClient::sub_want("mdsmap") 向monitor索取mdsmap信息

|__set_up_admin_socket() 设置admin通过socket可以处理的命令

|__SaftTimer::init() 初始化定时器

|__Beacon::init() 初始化Beacon

|__Messenger::set_myname() 设置Messenger名称

|__reset_tick()

MDSDaemon::reset_tick()

|__创建C_MDS_Tick类对象

|__SafeTimer::add_event_after() 调度timer,当定时器到达时,执行MDSDaemon::tick()函数

MDSDaemon::tick()

|__reset_tick() 重置定时器

|__MDSRank::tick() 执行MDSRank的tick操作

MDSDaemon::handle_command(MCommand *m) 该函数主要用来处理参数提供的命令,之后将命令执行结果反馈给调用者

|__检查参数的有效性以及权限,对于不满足条件的,设置反馈给调用者的信息

|__MDSDaemon::_handle_command() 执行具体的命令处理

|__创建MCommandReply类对象

|__设置该类对象的tid和data

|__m->get_connection->send_message() 将MCommandReply类对象发送给调用者

MDSDaemon::_handle_command()

|__cmd_getval() 解析command

|__对于prefix="get_command_descriptions/injectargs/exit/respawn/heap/cpu_profiler",则由MDSDaemon进行处理,否则由MDSRank::handle_command()进行处理

MDSDaemon::handle_mds_map(MMDSMap *m)

|__得到最新MDSMap的epoch值

|__将最新的MDSMap的epoch值于当前mdsmap的epoch进行比较,若最新epoch小于当前MDSMap的epoch,则直接返回

|__创建MDSMap类对象且用参数进行初始化

|__遍历当前MDSMap

|__对于当前MDSMap中的MDS进程在最新MDSMap中不存在,则设置该MDS进程down

|__对于在最新的MDSMap中此MDS作为STANDBY_REPLAY形式出现,则得到standby_for_rank值且写道whoami中

|__对于不是standby_replay模式

|__MDSDaemon::_handle_mds_map()

|__对于是standby_replay模式

|__对于变换了standby_for_rank的,则调用respawn()函数重新启动MDS进程

|__若mds_rank为空,则创建MDSRankDispatcher类对象且初始化

|__mds_rank->handle_mds_map() 由MDSRank处理mdsmap

MDSDaemon::_handle_mds_map()

|__对于最新MDSMap下此mds进程的状态是STATE_STANDBY

|__Beacon::set_want_state(STATE_STANDBY) 更新Beacon中want state状态为STATE_STANDBY

|__对于Beacon中want state=STATE_STANDBY

|__Beacon::set_want_state(STATE_BOOT) 更新Beacon中want state状态为STATE_BOOT

MDSDaemon::suicide()

|__删除定时器timer

|__clean_up_admin_socket() 清除admin socket

|__Beacon::set_want_state(STATE_DNE) 设置Beacon状态为STATE_DNE

|__Beacon::shutdown()

|__若mds_rank不为空

|__mds_rank->shutdown()

|__若mds_rank为空

|__objecter->shutdown()

|__timer->shudown()

|__monc->shutdown()

|__messenger->shutdown()

MDSDaemon::respawn()

|__调用execv()系统调用函数重新启动mds进程

MDSDaemon::ms_dispatch()

|__若beacon.get_want_state()==STATE_DNE,说明mds进程已经处于shutdown状态,因此不能处理消息

|__MDSDaemon::handle_core_message() 优先处理MDSDaemon消息

|__若mds_rank不为空

|__mds_rank->ms_dispatch() 由mds_rank处理消息

MDSDaemon::ms_get_authorizer()

|__monc->auth->build_authorizer() 由monitor的auth模块生成auth

MDSDaemon::handle_core_message()

|__ CEPH_MSG_MON_MAP

|__不处理

|__CEPH_MSG_MDS_MAP

|__handle_mds_map() 调用handle_mds_map()处理新的mds map消息

|__CEPH_MON_COMMAND

|__handle_command()

|__CEPH_COMMAND

|__handle_command()

|__CEPH_MSG_OSD_MAP

|__mds_rank->handle_osd_map() 由mds_rank来处理osd map

MDSDaemon::ms_handle_reset()

|__判断消息发送端是否是client,若不是则直接退出

|__判断beacon.get_want_state()是否是STATE_DNE,若是则直接退出

|__根据参数Connection类对象得到Session类对象

|__Session对象为空

|__Connection::mark_down()

|__Session对象不为空

|__若Session::is_closed()为真

|__Connection::mark_down()

|__Session::is_closed()不为真

|__Session::put()

MDSDaemon::ms_handle_remote_reset()

|__判断消息发送端是否是client,若不是则直接退出

|__判断beacon.get_want_state()是否是STATE_DNE,若是则直接退出

|__根据参数Connection类对象得到Session类对象

|__Session对象不为空

|__若Session::is_closed()为真

|__Connection::mark_down()

|__Session::is_closed()不为真

|__Session::put()

MDSDaemon::ms_verify_authorizer()

|__判断当前是否处于stopping,若是则直接退出

|__判断beacon.get_want_state()是否是STATE_DNE,若是则直接退出

|__根据peer_type的内容得到对应的authorize_handler(这里主要有两种handler,即:authorize_handler_cluster_registry/authorize_handler_service_registry。若peer_type==CEPH_ENTITY_TYPE_MDS则选择前者)

|__authorize_handler->verify_authorizer()

|__若认证成功

|__若mds_rank不为空

|__mds_rank->sessionmap.get_session() 通过mds_rank得到session

|__若session为空

|__创建Session类实例

|__初始化Session类实例

|__得到认证成功后的caps

|__Session::auth_caps.parse() 解析认证成功后的caps且保存到Session中

MDSDaemon::ms_handle_accept()

|__得到连接对应的Session类实例

|__设置连接到session类实例,即:s->connection = con

MDSDaemon::is_clean_shutdown()

|__若mds_rank不为空

|__返回mds_rank是否停止,即:mds_rank->is_stopped()

|__若mds_rank为空

|__返回true

感谢你能够认真阅读完这篇文章,希望小编分享的"MDSDaemon的示例分析"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

0