在博文Ceph源码分析之Async模块:1、异步通信核心模块EventCenter+Epoll 里面介绍了Async实现异步通信的底层核心模块。这次打算从上层应用来看ceph的通信模型模型。ceph通信模块的源代码定义在msg目录下,消息类型定义在message目录下面。概述ceph各个组件直接的通信以及和客户端直接的通信都依赖与ceph的通信模块,捋清楚通信模块对阅读源代码会有帮助。 先看一张简单的交互图 ceph通信模块的角色主要分为Messenger和Dispatcher两大角色MessengerDispatcher其它涉及到的两个重要的角色MessageConnection模块设计使用ceph通信模块来收发消息 * 发送消息接收消息 Dispatcher的使用最简单的方式就是应用本身作为Dispatcher的派生类,如此,Messenger便是直接通过应用关联,比如Monitor、osd、mgr都是应用组件本身作为Dispatcher的派生类。申请一个Dispatcher的派生类实例,做为应用的模块注册给Messenger,比如RadosClient里面会注册各个Client给Messenger,而这些Client都是Dispatcher的派生类。消息类型ceph的消息基类是:Message,Message里面设计了一个type成员,用来区分不同的消息类型,不同的消息模块可以通过type来构造,而这些type定义在Message.h中例子以ceph-mon为例子,Monitor类继承自Dispatcherclass Monitor : public Dispatcher, 实现它的ms_dispatcher方法,这个方法里面实现了mon的消息处理 注册给Messenger,add_dispatcher_tail方法就是将当前应用添加到dispatcher列表中messenger->add_dispatcher_tail(this);11Messenger收到消息转给dipatcher void ms_deliver_dispatch(Message *m) { m->set_dispatch_stamp(ceph_clock_now()); for (list::iterator p = dispatchers.begin(); p != dispatchers.end(); ++p) { if ((*p)->ms_dispatch(m)) return; } lsubdout(cct, ms, 0) "ms_deliver_dispatch: unhandled message " " " " from " get_source_inst() _conf->ms_die_on_unhandled_msg); m->put(); }1234567891011121312345678910111213ceph monitor处理消息 bool ms_dispatch(Message *m) override { lock.Lock(); _ms_dispatch(m); lock.Unlock(); return true; }123456123456
10-17 21:25
查看更多