看了一天的代码,但找不到MgrStandby::ms_dispatch2 调用的地方,查看DispatchQueue, Messenger 代码才知道缘故。
先看MgrStandby成员client_messenger,实现的类为AsyncMessenger,继承自Messenger
Messenger 类有成员:
class Messenger {
private:
std::deque<Dispatcher*> dispatchers;
pulic:
void ms_deliver_dispatch(const ceph::ref_t<Message> &m) {
for (const auto &dispatcher : dispatchers) {
if (dispatcher->ms_dispatch2(m))
return;
}
}
}
再看MgrStandby::init 实现
// Initialize Messenger 初始化Messenger
client_messenger->add_dispatcher_tail(this);
client_messenger->add_dispatcher_head(&objecter);
client_messenger->add_dispatcher_tail(&client);
client_messenger->start();
add_dispatcher* 是向成员dispatchers 队列中添加Dispatcher元素
再来看怎么调用 MgrStandby::ms_dispatch2
先看 DispatchQueue,成员列表中有:
class DispatchQueue {
void DispatchQueue::entry(){
QueueItem qitem = mqueue.dequeue();
...
const ref_t<Message>& m = qitem.get_message();
msgr->ms_deliver_dispatch(m);
}
void DispatchQueue::start()
{
...
dispatch_thread.create("ms_dispatch");
Messenger *msgr;
}
DispatchQueue start 函数启用线程,调用成员函数entry, 取出队列中的QueueItem, 然后通过Messenger类 deliver 函数分发到每个 Dispatcher 类中,调用类的函数为ms_dispatch2,这里就包含了 MgrStandby 类