千家信息网

ceph中Dispatcher模块的示例分析

发表于:2025-01-25 作者:千家信息网编辑
千家信息网最后更新 2025年01月25日,这篇文章主要介绍了ceph中Dispatcher模块的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Dipatcher类是消息
千家信息网最后更新 2025年01月25日ceph中Dispatcher模块的示例分析

这篇文章主要介绍了ceph中Dispatcher模块的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

Dipatcher类是消息分发的接口,OSD、MON、等类都继承该类,并实现了Dipatcher的消息分发接口

     1079 class OSD : public Dispatcher,-    1080         public md_config_obs_t {|    1081   /** OSD **/
      128 class Monitor : public Dispatcher,-     129                 public md_config_obs_t {|     130 public:|     131   // me|     132   string name;

在OSD::init()函数中把不同类型的Dipatcher加入到SimpleMessenger实例中

|    2146   // i'm ready!|    2147   client_messenger->add_dispatcher_head(this);|    2148   cluster_messenger->add_dispatcher_head(this);|    2149 |    2150   hbclient_messenger->add_dispatcher_head(&heartbeat_dispatcher);|    2151   hb_front_server_messenger->add_dispatcher_head(&heartbeat_dispatcher);|    2152   hb_back_server_messenger->add_dispatcher_head(&heartbeat_dispatcher);|    2153 |    2154   objecter_messenger->add_dispatcher_head(service.objecter);

在Messenger::add_dispatcher_head(Dispatcher *d)中加入Messenger::list dispatchers中,并调用ready(),SimpleMessenger::ready()重写了基类的ready,

|-   358   void add_dispatcher_head(Dispatcher *d) {||   359     bool first = dispatchers.empty();||   360     dispatchers.push_front(d);||   361     if (d->ms_can_fast_dispatch_any())||   362       fast_dispatchers.push_front(d);||   363     if (first)||   364       ready();||   365   }

在ready函数中调用DispatchQueue::start, start()函数启动DispatchQueue::DispatchThread和DispatchQueue::LocalDeliveryThread线程类,最终调用DispatchQueue::entry()和DispatchQueue::run_local_delivery。

     216 void DispatchQueue::start() -    217 {   |    218   assert(!stop);|    219   assert(!dispatch_thread.is_started());|    220   dispatch_thread.create("ms_dispatch");    //调用Thread::create->Thread::try_create->Thread::_entry_func->Thread::entry_wrapper->DispatchThread::entry|    221   local_delivery_thread.create("ms_local");|    222 }
|-    98   class DispatchThread : public Thread {||    99     DispatchQueue *dq;||   100   public:||   101     explicit DispatchThread(DispatchQueue *dq) : dq(dq) {}||-  102     void *entry() {|||  103       dq->entry();|||  104       return 0;|||  105     }  ||   106   } dispatch_thread;

在DispatchQueue::entry()中调用根据不同的命令码调用不同的Messenger类中的处理函数

void DispatchQueue::entry(){    .    .         switch (qitem.get_code()) {        case D_BAD_REMOTE_RESET:          msgr->ms_deliver_handle_remote_reset(qitem.get_connection());          break;        case D_CONNECT:          msgr->ms_deliver_handle_connect(qitem.get_connection());          break;        case D_ACCEPT:          msgr->ms_deliver_handle_accept(qitem.get_connection());          break;        case D_BAD_RESET:          msgr->ms_deliver_handle_reset(qitem.get_connection());          break;        default:          assert(0);        }      } else {        Message *m = qitem.get_message();        if (stop) {          ldout(cct,10) << " stop flag set, discarding " << m << " " << *m << dendl;          m->put();        } else {          uint64_t msize = pre_dispatch(m);          msgr->ms_deliver_dispatch(m);          post_dispatch(m, msize);        }      }      .      .}

在Messenger::ms_deliver_dispatch中最终调用不同的Dipatcher继承类的ms_dispatch进行处理

|-   579   void ms_deliver_dispatch(Message *m) {||   580     m->set_dispatch_stamp(ceph_clock_now(cct));||   581     for (list::iterator p = dispatchers.begin();                                                                                                            ||   582      p != dispatchers.end();||-  583      ++p) {|||  584       if ((*p)->ms_dispatch(m))     //在Dispatcher继承类中进行处理|||  585     return;|||  586     }||   587     lsubdout(cct, ms, 0) << "ms_deliver_dispatch: unhandled message " << m << " " << *m << " from "||   588              << m->get_source_inst() << dendl;||   589     assert(!cct->_conf->ms_die_on_unhandled_msg);||   590     m->put();||   591   }

感谢你能够认真阅读完这篇文章,希望小编分享的"ceph中Dispatcher模块的示例分析"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

0