ceph中Dispatcher模块的示例分析
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍了ceph中Dispatcher模块的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Dipatcher类是消息
千家信息网最后更新 2026年11月01日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
|- 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模块的示例分析"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!
不同
函数
篇文章
处理
模块
示例
分析
接口
消息
价值
兴趣
同时
命令
实例
更多
朋友
知识
类型
线程
编带
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网科技图片
互联网科技工作委员会主任
深圳科技互联网
礼当家互联网科技
互联网科技logo设计
佩信高科技互联网
现代科技和互联网有关系吗
中国科技互联网公司收入
阿里巴巴算科技企业还是互联网
互联网企业和科技型企业
贵州叶脉互联网科技有限公司所属行业
互联网对科技的发展
未来五年的互联网科技
迪庆互联网科技招生
珠海东科互联网科技有限公司
互联网科技接地气
科技和互联网行业的特点
黑龙江互联网科技公司
恒生互联网科技趋势
如何强化互联网金融科技
致骋互联网科技
互联网科技排名
广州互联网络科技有限公司
奔汉互联网科技
互联网科技大会
天扬科技互联网广告
互联网科技热点资讯
互联网科技有哪些公司
吉林省码上互联网科技电话
科技和互联网行业的特点