MDSRank類解析

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()

相關文章
相關標籤/搜索