MDSDaemon的示例分析

发布时间:2021-12-18 16:57:05 作者:小新
来源:亿速云 阅读:108

这篇文章主要介绍了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的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

推荐阅读:
  1. raid的示例分析
  2. react的示例分析

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

上一篇:怎么进行SAP CRM系统订单模型的设计与实现

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

相关阅读

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

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