共計 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 行業資訊頻道,更多相關知識等著你來學習!