OSD::init
|---client_messenger->add_dispatcher_head(this) // Messenger.h void add_dispatcher_head(Dispatcher *d)
|---bool first = dispatchers.empty() // 初始化时dispatcher为空,list<Dispatcher*> dispatchers
|---dispatchers.push_front(d);
|---ready() // void AsyncMessenger::ready()
|---stack->ready() // PosixNetworkStack : public NetworkStack 的ready
|---for (auto &&p : processors)
|---p->start(); // void Processor::start() 启动work
|---worker->center.submit_to(worker->center.get_id(),
[this]() { worker->center.create_file_event(listen_socket.fd(), EVENT_READABLE, listen_handler); }, false);
// 执行EventCenter::create_file_event
|---EventCenter::FileEvent *event = _get_file_event(fd);
|---r = driver->add_event(fd, event->mask, mask); // int EpollDriver::add_event(int fd, int cur_mask, int add_mask)
|---if (epoll_ctl(epfd, op, fd, &ee) == -1) // 唤醒 EventCenter::process_events
|---if (mask & EVENT_READABLE)
|---event->read_cb = ctxt // 读回调
|---if (mask & EVENT_WRITABLE)
|---event->write_cb = ctxt // 写回调
|---dispatch_queue.start() // DispatchQueue::start()
|---dispatch_thread.create("ms_dispatch") // 启动线程 DispatchQueue::entry()
|---while (true) {
|---while (!mqueue.empty()) {
|---if (qitem.is_code())
|---local_delivery_cond.Wait(local_delivery_lock);
|---else
|---Message *m = qitem.get_message();
|---msgr->ms_deliver_dispatch(m) // Messenger.h ms_deliver_dispatch
|---for (list<Dispatcher*>::iterator p = dispatchers.begin()
|---if ((*p)->ms_dispatch(m)) // OSD::ms_dispatch(Message *m) 对应的类处理函数的入口
|---post_dispatch(m, msize);
|---dispatch_throttle_release(msize)
|---cond.front()->SignalOne(); //唤醒线程
|---cond.Wait(lock)
|---local_delivery_thread.create("ms_local") // 启动线程 DispatchQueue::run_local_delivery()
|---while (true) {
|---if (local_messages.empty()) {
|---local_delivery_cond.Wait(local_delivery_lock)
|---fast_preprocess(m);
|---msgr->ms_fast_preprocess(m)
|---for (list<Dispatcher*>::iterator p = fast_dispatchers.begin()
|---(*p)->ms_fast_preprocess(m) // OSD::ms_fast_preprocess(Message *m)
|---if (can_fast_dispatch(m))
|---msgr->ms_fast_dispatch(m)
|---for (list<Dispatcher*>::iterator p = fast_dispatchers.begin()
|---if ((*p)->ms_can_fast_dispatch(m))
|---(*p)->ms_fast_dispatch(m) // OSD::ms_fast_dispatch(Message *m)
|---post_dispatch(m, msize)
|---else
|---enqueue(m, priority, 0); // 加入队列
ceph通信(3)——AsyncMessenger启动接收线程
最新推荐文章于 2022-07-22 19:14:00 发布