MDSDaemon的示例分析

75次阅读
没有评论

共计 4819 个字符,预计需要花费 13 分钟才能阅读完成。

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

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

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

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计4819字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)