ceph中Dispatcher模块的示例分析
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,这篇文章主要介绍了ceph中Dispatcher模块的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Dipatcher类是消息
千家信息网最后更新 2025年12月02日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安全错误
数据库的锁怎样保障安全
revit服务器怎么添加
asp.net和数据库
沽源县网络安全培训学校
数据库框架开发实例
昆山网络技术转让产品
数据库分页查询语
河北erp软件开发免费咨询
查询达梦数据库版本号
网络安全论文参考文献标注
nbu一体机数据库限制
网络技术考试及答案
伯俊boss 数据库
奉贤区推广软件开发设备
网吧服务器蓝屏显示黑色白字
华为独立软件开发合作伙伴
邯郸计算机软件开发价位
第五人格什么叫服务器
上海中搜网络技术有限公司
危化品数据库分类
网络安全培训会议名称
数据库优化复习第一章
省公安厅网络安全防护项目
郑州3d软件开发公司
浙江定制软件开发哪家好
软件开发交接内容
江苏出口商品分析软件开发
小布什国家网络安全策略
会员服务器系统架构
浙江pdu服务器电源价格
福州优易通网络技术有限公司