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
|- 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安全错误
数据库的锁怎样保障安全
网络安全手抄报图片不涂色
平安银行软件开发
茶楼效果图软件开发
河北电商软件开发怎么样
维普收录科技期刊的数据库
c游戏服务器
如何查数据库的数据量
ios手机软件开发哪家好
合唱软件开发
rust查看服务器时间
在上海从事软件开发工作
网络安全组件图片大全
网络技术专业就业岗位
上海网络技术咨询创新服务
luxe服务器搭建
做好网络安全风险研判工作
服务器安全通知
新余软件开发定制公司
网信办网络安全中心
对日外包软件开发
ps5无法联机在线服务器
软件开发付费流程
网络安全概念股党政业务
数据库基础与应用的知识
嘉峪关的酒钢软件开发怎么样
网络安全政治站位
浙江华为服务器虚拟化安装云主机
2020年网络安全权威报告
oem服务器没核显怎么配命令
网络技术是讲什么