本章我们介绍一下Ceph的网络通信模块,这是客户端和服务器通信的底层模块,用来在客户端和服务器之间接收和发送请求。其实现功能比较清晰,是一个相对比较独立的模块,理解起来比较容易。
1. Messenger
Messenger管理着两类dispatcher:
-
普通dispatcher
-
fast dispater
代码实现较为简单,主要功能就是当有新的message到来时,分发消息;当有新的ingoing连接进来时,回调accept以及verify authorizer等;当有新的outgoing连接建立时,回调connect以及get authorizer等。
这里存在的一个疑问是,当调用add_dispatcher_head()或add_dispatcher_tail()加入一个dispatcher时,有可能同时加入到普通dispatcher列表,也有可能加入到fast dispatcher列表。那么当一个消息发送到dispatcher queue时,是否会回调两次呢?
答案是不会的。因为在消息进行投递时,其首先会调用ms_can_fast_dispatch()来判断是否可以进行快速投递,如果可以则不进行普通投递了。
2. SimpleMessenger
3. Connection
4. PipeConnection
PipeConnection继承自Connection,最主要是其可以与pipe相关连,从而可与实际的socket建立联系。
上面讲到Connection::send_message()函数有些奇怪,这里我们来看一下其实现:
可以看到其并不能直接发送消息,而是调用SimpleMessenger来发送,最终是调用所关联的pipe来发送。
5. Accepter
6. Pipe
7. Dispatcher
8. DispatchQueue
现在我们来看一下消息投递的具体流程:
1)本地消息
从上面我们可以看到,对于发送的目标地址是本地的消息,这直接将消息插入到local_messages队列。
2) 收到的incomming消息的投递
主要有如下两个地方:
[参看]