Ceph网络模块(2) - AsyncMessenger数据结构分析
本文主要介绍AsyncMessenger的代码框架结构和主要使用到的数据结构
上图表示Ceph的AsyncMessenger模块中各个关键类之间的联系。在AsyncMessenger模块中用到的类主要有14个,下面逐一介绍每个类的作用,以及其中包含的主要成员变量和方法。
1、 AsyncMessenger类、SimplePolicyMessenger类和Messenger类
AsyncMessenger类、SimplePolicyMessenger类和Messenger类三者是继承与被继承的关系,Messenger是一个抽象的消息管理器,其主要接口在派生类AsyncMessenger中实现,SimplePolicyMessenger类则是对消息管理器的一些连接的策略进行定义的设置,AsyncMessenger中定义和实现了消息管理器的相关成员变量以及方法。
一个AsyncMessenger实例的关键成员变量以及类方法如下表所示(包括该类继承的父类成员变量以及类方法)。AsyncMessenger包含一个WorkerPool对象、一个Processor实例,以及3个AsyncConnectionRef对象列表和1个ConnectionRef对象列表。
AsyncMessenger类中的成员变量:
成员变量名 | 返回值类型 | 描述 |
*pool | WorkerPool | 通过pool->get_worker()从线程池中获取工作线程来进行工作 |
processor | Processor | Processor实例,主要用来监听连接,绑定socket,接受连接请求等,相当于AsyncMessenger的处理中心 |
listen_sd | int | 定义的监听套接字 |
conns | ceph::unordered_map(entity_addr_t, AsyncConnectionRef) | 地址和连接的map表,创建一个新的连接时将连接和和地址信息加入到这个map表中,在发送消息时先根据地址对这个map进行一次查找,如果找到了返回连接,如果没有找到创建一个新的连接。 |
accepting_conns | set(AsyncConnectionRef) | 接收连接的集合,这个集合主要存放那些已经接收的连接。 |
deleted_conns | set(AsyncConnectionRef) | 已经关闭并且需要清理的连接的集合 |
local_connection | ConnectionRef | 本地连接的计数器 |
did_bind | bool | 初始值为false,绑定地址后置为true,stop的时候再次置为false |
AsynsMessenger类中的成员方法:
成员方法名 | 返回值类型 | 描述 |
bind (const entity_addr_t& bind_addr) | int | 绑定套接字,具体绑定过程是由Processor的bind()函数完成的 |
start() | int | 注册一个AsyncMessenger的实例后,启动这个实例,具体执行过程是WokerPool的start()函数完成的。 |
wait() | void | 等待停止的信号,如果收到停止的信息后,调用Processor的stop()函数,然后将did_bind置为false,最后删除建立的连接 |
send_message (Message *m, const entity_inst_t& dest) | int | 加了一个锁,然后调用_send_message(m, dest),将消息发送到目的地址 |
get_connection (const entity_inst_t& dest) | ConnectionRef | 函数用来建立连接,判定是否为本地连接,否则再继续查找连接是否已经存在,如果不存在再创建一个连接 |
ready() | void | 注册的AsyncMessenger已经准备好了,启动事件处理中心,开始工作,启动工作线程 |
create_connect(const entity_addr_t& addr, int type) | AsyncConnectionRef | create一个连接并将其加到conns中 |
submit_message(Message *m, AsyncConnectionRef con,const entity_addr_t& dest_addr, int dest_type) | void | 发送消息的时候会用到,根据目的地址判断需要发送消息的连接是否存在,以及连接是否是本地连接,如果是本地连接,直接对消息进行dispatch,如果连接不存在,需要根据消息类型创建新的连接 |
_send_message(Message *m, const entity_inst_t& dest) | int | 从连接中查找目的地址,然后调用s |