MDSRank與MDSDaemon一塊兒構成了MDS進程的核心處理類。node
=====================MDSRankDispatcher相關=========================數組
MDSRankDispatcher是MDSRank與MDSDaemon的接口類,MDSRankDispatcher就是給MDSDaemon用的。session
MDSRankDispatcher::init()app
|__update_log_config() 從配置文件中讀取log配置以及更新log配置ide
|__create_logger() 建立logger函數
|__建立PerfCounterBuilder類實例且初始化該類實例ui
|__MDLog::create_logger()spa
|__Server::create_logger()線程
|__MDCache::register_perfcounters() rest
|__handle_osd_map()
|__對於snapserver不爲空,則調用SnapServer::check_osd_map()對已經purged的和未purge的snap進行處理
|__Server::handle_osd_map()
|__檢查MDSRank::Objecter對應的OSDMap中全部的osd是否包含CEPH_OSDMAP_FULL標識
|__MDCache::notify_osdmap_changed()
|__StrayManager::update_op_limit()
|__Objecter::maybe_request_map()
|__MonClient::sub_want(「osdmap」)
|__MonClient::renew_subs() 調用MonClient向Monitor節點索取OSDMap
|__progress_thread.create() 建立ProgressThread線程
|__Finisher::start()
MDSRankDispatcher::tick()
|__heartbeat_reset()
|__g_ceph_context->get_heartbeat_map()->reset_timeout() 重置heartbeat超時時間,避免被monitor kill
|__check_ops_in_flight()
|__op_tracker.check_ops_in_flight() 從op_tracker中讀取到全部in_flight的操做名稱
|__遍歷全部處於in_flight的操做名稱且輸出到clog
|__progress_thread.signal() 喚醒progress_thread線程
|__MDLog::flush() flush全部log
|__MDS進程狀態處於active或stopping
|__MDCache::trim() 週期性的trim cache
|__MDLog::trim() 週期性的trim log
|__更新logger
|__對於當前處於active或stopping或clientreplay狀態
|__Server::find_idle_sessions()
|__locker->tick()
|__對於當前處於reconnect狀態
|__Server::reconnect_tick()
|__對於當前處於active狀態
|__MDBalancer::tick()
|__MDCache::find_stale_fragment_freeze()
|__MDCache::migrator::find_stale_export_freeze()
|__SnapServer::check_osd_map()
|__Beacon::notify_health()
MDSRankDispatcher::shutdown()
|__設置stopping=true
|__SafeTimer::shutdown() 關閉定時器
|__MDLog::shutdown() 關閉MDLog
|__Finisher::stop() 關閉Finisher
|__MDCache::shutdown() 關閉MDCache
|__Objecter::shutdown() 關閉Objecter
|__MonClient::shutdown() 關閉MonClient
|__op_tracker.on_shutdown() 回調op_tracker的shutdown回調函數
|__Messenger::shutdown() 關閉Messenger
|__若heartbeat_handle_d不爲空,則調用get_heartbeat_map()->remove_worker()來刪除這個handle
MDSRankDispatcher::ms_dispatch()
|__inc_dispatch_depth()
|___dipsatch() 調用_dispatch()函數作核心分發處理
|__dec_dispatch_depth()
==========================消息dispatch相關===================================
MDSRank::retry_dispatch()
|__inc_dispatch_depth()
|___dispatch()
|__dec_dispatch_depth()
MDSRank::_dispatch()
|__若message不是從MDS發過來的,則直接返回
|__若MDS處於laggy狀態
|__將message插入到waiting_for_nolaggy數組
|__若waiting_for_nolaggy數組不爲空且此消息爲新的消息
|__將message插入到waiting_for_nolaggy數組
|__handle_deferrable_message() 核心消息處理函數
|___advance_queues() 核心消息處理函數
|__此時若MDS處於laggy狀態,則直接返回
|__若MDS處於CLIENTREPLAY狀態且replay_queue爲空
|__若此時沒有client request
|__clientreplay_done()
|__若此時MDS處於stopping狀態
|__MDLog::trim()
|__stopping_done()
MDRank::handle_deferrable_message()
|__獲取待處理消息的類型
|__MDS_PORT_CACHE
|__MDCache::dispatch() 對於CACHE類型的消息,由MDCache負責分發處理
|__MDS_PORT_MIGRATOR
|__MDCache::migrator::dispatch() 對因而MIGRATOR類型的消息,由MDCache::migrator負責分發處理
|__CEPH_MSG_CLIENT_SESSION/CEPH_MSG_CLIENT_RECONNECT/CEPH_MSG_CLIENT_REQUEST
|__Server::dispatch() 對於client session相關的消息,由Server負責分發處理
|__MSG_MDS_SLAVE_REQUEST
|__Server::dispatch() 對於SLAVE相關的消息,由Server負責分發處理
|__MSG_MDS_HEARTBEAT
|__MDBalancer::proc_message() 對於HEARTBEAT相關的消息,由MDBalance負責處理
|__MSG_MDS_TABLE_REQUEST
|__若request的操做碼<0,則說明請求client處理
|__get_table_client() 從client table中找到對應的client
|__client->handle_request() 由MDSTableClient負責處理消息請求
|__若request的操做碼>=0,則說明請求server處理
|__get_table_server() 從server table中找到對應的server
|__server->handle_request() 由MDSTableServer負責處理消息請求
|__MSG_MDS_LOCK/MSG_MDS_INODEFILECAPS
|__Locker::dispatch() 對於LOCK類型的消息,由Locker負責分發處理
|__CEPH_MSG_CLIENT_CAPS/CEPH_MSG_CLIENT_CAPRELEASE/CEPH_MSG_CLIENT_LEASE
|__Locker::dispatch() 對於client caps相關的消息,由Locker負責分發處理
MDSRank::_advance_queues()
|__遍歷finished_queue
|__finished_queue.front()->complete(0) 調用finished_queue中成員中的complete回調函數
|__heartbeat_reset()
|__遍歷waiting_for_nolaggy
|__若waiting_for_nolaggy成員中的元素在有效的MDSMap中
|__handle_deferrable_message() 處理這些等待nolaggy的消息
MDSRank::heartbeat_reset()
|__若hb爲空,則直接返回
|__g_ceph_context->get_heartbeat_map()->reset_timeout() 重置heartbeat定時器,避免MDS suicide
========================獲取MDSRank類成員相關============================
MDSRank::get_metadata_pool()
|__MDSMap::get_metadata_pool() 返回MDRank類中MDSMap類實例對應的metadata pool
MDSRank::get_table_client() 目前只有SNAP使用MDSTable功能,其它模塊沒有使用
|__根據輸入參數判斷,若參數是TABLE_SNAP則返回snapclient,不然返回null
MDSRank::get_table_server() 目前只有SNAP使用MDSTable功能,其它模塊沒有使用
|__根據輸入參數判斷,若參數是TABLE_SNAP則返回snapserver,不然返回null
MDSRank::set_osd_epoch_barrier()
|__設置osd_epoch_barrier = e
MDSRank::get_laggy_until()
|__Beacon::get_laggy_until() 實際上返回的是Beacon的laggy時間
MDSRank::is_daemon_stopping()
|__返回stopping的當前值
MDSRank::reqeust_state()
|__Beacon::set_want_state() 設置Beacon的want state
|__Beacon::send() Beacon將狀態發送給Monitor
==========================MDSRank啓動/重啓相關=============================
MDSRank::suicide()
|__若suicide_hook不爲空,則調用suicide_hook->complete(0)函數
MDSRank::respawn()
|__若respawn_hook不爲空,則調用respawn_hook->complete(0)函數
MDSRank::damaged()
|__Beacon::set_want_state(STATE_DAMAGED) 設置Beacon的狀態爲DAMAGED
|__MonClient::flush_log()
|__Beacon::notify_health()
|__respawn() 從新啓動到standby模式
MDSRank::damaged_unlocked()
|__damaged()
MDSRank::handle_write_error()
|__若error==-EBLACKLISTED
|__respawn() 從新啓動MDS
|__若mds_action_on_write_error>=2
|__respawn()
|__若mds_action_on_write_error==1 默認行爲
|__MDCache::force_readonly()
MDSRank::is_stale_message()
|__消息源來自MDS進程
|__消息源MDS進程在mdsmap中沒有inst信息/mdsmap中的inst信息與消息所帶的inst信息不一致/mdsmap中消息源MDS進程已經down了
|__若消息的類型是CEPH_MSG_MDS_MAP,則不認爲是stale message
|__若消息的類型是MSG_MDS_CACHEEXPIRE且mdsmap中的inst信息與消息所帶的inst信息一致,則不認爲是stale message
|__不然,認爲是stale message
|__消息源不是來自MDS進程,則不認爲是stale message
=========================send message相關=====================================
MDSRank::send_message()
|__Connection::send_message() 調用Connection的send_message()函數發送消息
MDSRank::send_message_mds()
|__檢查mdsmap中對端MDS是不是up狀態,若不是則直接返回
|__對於對端MDS的MDSMap不是最新的
|__messenger->send_message() 將最新的MDSMap發送給對端MDS
|__peer_mdsmap_epoch[mds] = mdsmap->get_epoch() 更新對端MDSMap所擁有的epoch值
|__messenger->send_message() 將消息發送給對端MDS
MDSRank::forward_message_mds()
|__對於消息類型是CEPH_MSG_CLIENT_REQUEST
|__messenger->send_message(MClientRequestForward()) 將client發送過來的消息轉發到目的MDS處
|__對於對端MDS的MDSMap不是最新的
|__messenger->send_message() 將最新的MDSMap發送給對端MDS
|__peer_mdsmap_epoch[mds] = mdsmap->get_epoch() 更新對端MDSMap所擁有的epoch值
|__messenger->send_message() 將消息發送給對端MDS
MDSRank::send_message_client()
|__若session->connection不爲空
|__session->connection->send_message() 發送消息到client端
|__若session->connection爲空
|__session->reopen_out_queue.push_back() 將消息插入消息隊列中等待connection從新創建完畢後再發送
============================ProgressThread線程相關==========================
MDSRank::ProgressThread::entry() ProgressThread核心處理函數
|__若當前沒有須要處理的內容
|__cond.Wait()
|__若stopping==true
|__退出核心處理函數
|__MDSRank::_advance_queues()
MDRank::ProgressThread::shutdown()
|__調用線程庫函數join()
=========================MDSRank boot相關======================================
MDSRank::boot_start() 做爲類C_MDS_BootStart的回調函數
|__若返回值小於0(執行boot過程當中有錯誤出現)
|__當前狀態是STANDBY_REPLAY而且返回值是EAGAIN
|__respawn()
|__返回值是EINVAL或ENOENT
|__damaged()
|__返回值不是上述的狀況
|__suicide()
|__判斷當前所處的BootStep階段
|__MDS_BOOT_INITIAL
|__MDCache::init_layouts()
|__建立MDSGatherBuilder類實例且設置下一個BootStep階段爲MDS_BOOT_ROOT
|__InoTable::set_rank() 設置InoTable的rank值
|__InoTable::load() 加載InoTable
|__SessionMap::set_rank() 設置SessionMap的rank值
|__SessionMap::load() 加載SessionMap
|__MDLog::open() 打開MDLog
|__SnapServer::set_rank() 設置SnapServer的rank值
|__SnapServer::load() 加載SnapServer
|__MDSGatherBuilder::activate()
|__MDS_BOOT_ROOT 打開或建立ROOT inode
|__建立MDSGatherBuilder類實例且設置下一個BootStep階段爲MDS_BOOT_PREPARE_LOG
|__MDCache::open_mydir_inode() 加載mydir的inode
|__當前處於Starting狀態或者當前MDS節點是MDSMap的根節點
|__MDCache::open_root_inode()
|__當前不是處於Starting狀態或者當前MDS節點不是MDSMap的根節點
|__MDCache::create_root_inode()
|__MDSGatherBuilder::activate()
|__MDS_BOOT_PREPARE_LOG
|__當前MDS處於replay狀態
|__MDLog::replay() 執行replay操做
|__當前MDS不是處於replay狀態
|__MDLog::append()
|__starting_done()
|__MDS_BOOT_REPLAY_DONE
|__replay_done()
MDRank::starting_done()
|__request_state(STATE_ACTIVE) 設置當前狀態爲ACTIVE
|__MDCache::open_root()
|__MDLog::start_new_segment()
MDSRank::creating_done()
|__request_state(STATE_ACTIVE)
MDSRank::boot_create()
|__建立MDSGatherBuilder類實例且執行完畢後執行回調函數creating_done()
|__MDCache::init_layouts()
|__SnapServer::set_rank()
|__InoTable::set_rank()
|__SessionMap::set_rank()
|__MDLog::create()
|__MDLog::prepare_new_segment()
|__若MDS節點是MDSMap的根節點
|__MDCache::create_empty_hierarchy()
|__MDCache::create_mydir_hierarchy()
|__InoTable::reset()
|__InoTable::save()
|__SessionMap::save()
|__SnapServer::reset()
|__SnapServer::save()
|__MDLog::journal_segment_subtree_map()
|__MDLog::flush()
|__MDSGatherBuilder::activate()
=====================replay相關=============================
MDSRank::calc_recovery_set()
|__MDSMap::get_recovery_mds_set() 從MDSMap中獲取處處於recovery狀態的全部MDS節點
|__從recovery狀態下的MDS節點中刪除此MDS節點
|__MDCache::set_recovery_set() 更新MDCache中的recovery_set值
MDSRank::replay_start()
|__設置standby_replaying=true
|__calc_recovery_set()
|__Objecter::wait_for_map() 獲取上次失敗前最新的osdmap
|__boot_start()
MDSRank::_standby_replay_restart_finish()
|__若處於standby MDS的journal小於active MDS的journal的expire_pos
|__respawn() 從新啓動MDS
|__若處於standby MDS的journal大於active MDS的journal的expire_pos
|__MDLog::standby_trim_segments()
|__boot_start(MDS_BOOT_PREPARE_LOG) 調用boot_start()函數進行replay操做
MDSRank::standby_replay_restart()
|__standby_replaying==true
|__MDLog::get_journaler()->reread_head_and_probe() 獲得journal的head和probe信息後,執行回調函數_standby_replay_restart_finish
|__standby_replaying==false
|__Objecter::wait_for_map() 獲取上次失敗前最新的osdmap
|__成功獲取最新的osdmap
|__MDLog::get_journaler()->reread_head_and_probe() 獲得journal的head和probe信息後,執行回調函數_standby_replay_restart_finish
MDSRank::replay_done()
|__若處於standby replay狀態
|__設置定時器,當定時器超時後執行standby_replay_restart()
|__若此時正處於replaying(standby_replaying==true)
|__設置standby_replaying=false
|__standby_replay_restart() 從新啓動standby replay
|__若處於replay完成狀態
|__journal read的位置應該和journal write的位置重合
|__設置MDS journal writable
|__SessionMap::save() 保存SesionMap
|__InoTable::save() 保存InoTable
|__若此時只有一個MDS
|__request_state(STATE_RECONNECT) 設置當前狀態爲RECONNECT
|__若此時有多個MDS
|__request_state(STATE_RESOVE) 設置當前狀態爲RESOLVE
==================resolve相關===========================
MDSRank::reopen_log()
|__MDCache::rollback_uncommitted_fragments() 在MDCache中回滾未提交的fragments
MDSRank::resolve_start()
|__reopen_log()
|__MDCache::resolve_start() 調用MDSCache之行resolve,當之行完畢後調用回調函數resolve_done()
MDSSRank::resolve_done()
|__request_state(STATE_RECONNECT) 設置當前狀態爲RECONNECT
====================reconnect相關==========================
MDSRank::reconnect_start()
|__若last_state==STATE_REPLAY
|__reopen_log()
|__Server::reconnect_client() 調用Server從新與client進行鏈接,鏈接成功後執行回調函數reconnect_done()
MDSRank::reconnect_done()
|__request_state(STATE_REJOIN) 設置當前狀態爲REJOIN
=====================rejoin相關============================
MDSRank::rejoin_joint_start()
|__MDCache::rejoin_send_rejoins()
MDSRank::rejoin_start()
|__MDCache::rejoin_start() 調用MDCache之行rejoin操做,之行完畢後執行回調函數rejoin_done()
MDSRank::rejoin_done()
|__MDCache::show_subtrees()/show_cache()
|__若replay_queue爲空
|__request_state(STATE_ACTIVE)
|__若replay_queue不爲空
|__request_state(STATE_CLIENTREPLAY)
=======================clientreplay相關==============================
MDSRank::clientreplay_start()
|__queue_one_replay()
MDSRank::queue_on_replay()
|__若replay_queue爲空
|__若MDSCache::get_num_client_requests()==0
|__clientreplay_done() client replay完成
|__replay_queue不爲空
|__queue_waiter() 從replay_queue隊列中取出一個請求待處理
MDSRank::clientreplay_done()
|__request_state(STATE_ACTIVE)
==========================active相關================================
MDSRank::active_start()
|__若last_state==STATE_CREATING
|__MDCache::open_root()
|__MDCache::clean_open_file_lists()
|__MDCache::export_remaining_imported_caps()
|__MDCache::reissue_all_caps()
==========================recovery相關==========================
MDSRank::recovery_done()
|__若MDSMap中的tableserver==whoami
|__從MDSMap中獲得clientreplay/active/stopping狀態下的MDS節點
|__SnapServer::finish_recovery()
|__MDSCache::start_recovered_truncates()
|__MDSCache::do_file_recover()
|__MDSCache::populate_mydir()
=======================stopping相關========================
MDSRank::stopping_start()
|__MDCache::shutdown_start()
MDSRank::stopping_done()
|__request_state(STATE_STOPPED)
=========================handle mdsmap相關==============================
MDSRankDispatcher::handle_mds_map(MMDSMap *m, MDSMap *oldmap)
|__獲得MDS進程的當前狀態oldstate = state
|__從MDSMap中獲得最新的state
|__更新peer_mdsmap_epoch[] = epoch 更新對端mdsmap的epoch值
|__根據oldstate和state判斷更新的狀態是否有效
|__無效,則調用respawn()
|__Beacon::set_want_state(state) 更新Beacon的當前state值
|__以前的狀態是recover,如今的狀態是active或clientreplay
|__recovery_done() 表示完成了recover
|__active狀態
|__active_start()
|__replay狀態
|__replay_start()
|__resolve狀態
|__resolve_start()
|__reconnect狀態
|__reconnect_start()
|__rejoin狀態
|__rejoin_start()
|__clientreplay狀態
|__clientreplay_start()
|__creating狀態
|__boot_create()
|__starting狀態
|__boot_start()
|__stopping狀態
|__stopping_start()
|__oldmap不是resolving而mdsmap是resolving
|__MDSMap::get_mds_set(STATE_RESOLVE)
|__calc_recovery_set()
|__MDCache::send_resolves()
|__oldmap不是rejoining而mdsmap是rejoining
|__rejoin_joint_start()
|__oldstate>=STATE_REJOIN
|__從old mdsmap和new mdsmap中分別取出STATE_ACTIVE/STATE_CLIENTREPLAY/STATE_REJOIN的MDS
|__遍歷new mdsmap中的這些MDS
|__MDS不在old mdsmap中 新的MDS
|__MDCache::kick_recovers()
|__MDCache::kick_open_ino_peers()
|__oldstate>=STATE_CLIENTREPLAY
|__從old mdsmap和new mdsmap中分別取出STATE_ACTIVE/STATE_CLIENTREPLAY的MDS
|__遍歷new mdsmap中的這些MDS
|__MDS不在old mdsmap中 新的MDS
|__handle_mds_recovery()
|__從old mdsmap和new mdsmap中分別取出down的MDS
|__遍歷new mdsmap中的這些MDS
|__MDS不在old mdsmap中 新的down掉的MDS
|__Messenger::mark_down()
|__handle_mds_failure()
|__從new mdsmap中獲得全部up狀態的MDS
|__遍歷new mdsmap中的這些MDS
|__在old mdsmap中存在可是inst內容不一致 新的MDS修改了inst
|__Messenger::mark_down()
|__handle_mds_failure()
|__從old mdsmap和new mdsmap中獲得全部stopped狀態的MDS
|__遍歷new mdsmap中的這些MDS
|__在old mdsmap中不存在 新的MDS stopped了
|__MDCache::migrator::handle_mds_failure_or_stop()
|__當前沒有replay狀態的MDS
|__MDBalancer::try_rebalance()
|__遍歷waiting_for_mdsmap數組
|__喚醒該數組中全部成員
|__當前狀態是active
|__set_osd_epoch_barrier()
|__MDCache::noteify_mdsmap_changed()
MDSRank::handle_mds_recovery()
|__MDCache::handle_mds_recovery()
|__SnapServer::handle_mds_recovery()
|__queue_waiter(waiting_for_active_peer[who])
MDSRank::handle_mds_failure()
|__MDCache::handle_mds_failure()
|__SnapClient::handle_mds_failure()