共计 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 行业资讯频道,更多相关知识等着你来学习!