MDSDaemon的示例分析

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

创新互联是一家以网络技术公司,为中小企业提供网站维护、成都网站设计、网站建设、网站备案、服务器租用、域名注册、软件开发、微信小程序定制开发等企业互联网相关业务,是一家有着丰富的互联网运营推广经验的科技公司,有着多年的网站建站经验,致力于帮助中小企业在互联网让打出自已的品牌和口碑,让企业在互联网上打开一个面向全国乃至全球的业务窗口:建站欢迎来电:13518219792

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


网站栏目:MDSDaemon的示例分析
分享网址:http://ybzwz.com/article/gjchsg.html