扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
这篇文章主要介绍了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的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持创新互联,关注创新互联行业资讯频道,更多相关知识等着你来学习!
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流