MDSRank类解析

MDSRank与MDSDaemon一起构成了MDS进程的核心处理类。

=====================MDSRankDispatcher相关=========================

MDSRankDispatcher是MDSRank与MDSDaemon的接口类,MDSRankDispatcher就是给MDSDaemon用的。

MDSRankDispatcher::init()

|__update_log_config()                 从配置文件中读取log配置以及更新log配置

|__create_logger()                         创建logger

     |__创建PerfCounterBuilder类实例且初始化该类实例

     |__MDLog::create_logger()

     |__Server::create_logger()

     |__MDCache::register_perfcounters()     

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

转载于:https://my.oschina.net/linuxhunter/blog/708337

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值