您好,登錄后才能下訂單哦!
這篇文章主要介紹了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的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。