看了一天的代码,但找不到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 类