AsyncMessenger(cct, name, type, std::move(lname), nonce); // name = entity_name_t、type = "async+posix"、 lname = "client" nonce = pid
entity_name_t::OSD(whoami)
|---entity_name_t(TYPE_OSD, i) // static const int TYPE_OSD = CEPH_ENTITY_TYPE_OSD; 4
//Messenger(cct, name)
Messenger(CephContext *cct_, entity_name_t w) : trace_endpoint("0.0.0.0", 0, "Messenger"),
my_inst(), default_send_priority(CEPH_MSG_PRIO_DEFAULT), started(false),
magic(0), socket_priority(-1), cct(cct_), crcflags(get_default_crc_flags(cct->_conf))
|---my_inst.name = w;
//SimplePolicyMessenger(cct, name, mname, _nonce)
SimplePolicyMessenger(CephContext *cct, entity_name_t name, string mname, uint64_t _nonce) : Messenger(cct, name), policy_lock("SimplePolicyMessenger::policy_lock")
//dispatch_queue(cct, this, mname) this = AsyncMessenger
DispatchQueue构造
|---ceph_spin_init(&global_seq_lock);
//根据AsyncMessenger::NetworkStack::posix _associated_objs[name] = new TypedSingletonWrapper<T>(p);中保存一个StackSingleton
|---cct->lookup_or_create_singleton_object<StackSingleton>(single, "AsyncMessenger::NetworkStack::"+transport_type);
|---single->ready(transport_type); // single = StackSingleton
|---stack = NetworkStack::create(cct, type); // 初始化一个std::shared_ptr<NetworkStack> stack;
|---return std::make_shared<PosixNetworkStack>(c, t); // stack为PosixNetworkStack对象指针 PosixNetworkStack构造
|---stack->start(); // NetworkStack::start()
|---for (unsigned i = 0; i < num_workers; ++i) // num_workers 在基类中初始化,来自于配置文件
|---std::function<void ()> thread = add_thread(i); // add_thread(i)返回值
|---spawn_worker(i, std::move(thread)); // PosixNetworkStack--> spawn_worker
|---threads.resize(i+1);
|---threads[i] = std::thread(func);
|---local_worker = stack->get_worker(); // NetworkStack::get_worker()
|---worker_load最小时对应的Worker* PosixWorker
|---local_connection = new AsyncConnection(cct, this, &dispatch_queue, local_worker);
|---init_local_connection()
|---_init_local_connection
|---ms_deliver_handle_fast_connect(local_connection.get());
|---list<Dispatcher*>::iterator p = fast_dispatchers.begin() // 通过add_dispatcher_head或add_dispatcher_tail添加fast_dispatchers,构造时为空
|---(*p)->ms_handle_fast_connect(con);
|---reap_handler = new C_handle_reap(this);
|---for (unsigned i = 0; i < processor_num; ++i)
|---processors.push_back(new Processor(this, stack->get_worker(i), cct));
//DispatchQueue构造
DispatchQueue(CephContext *cct, Messenger *msgr, string &name)
: cct(cct), msgr(msgr), // msgr = AsyncMessenger
lock("Messenger::DispatchQueue::lock" + name),
mqueue(cct->_conf->ms_pq_max_tokens_per_priority, cct->_conf->ms_pq_min_cost), // PrioritizedQueue<QueueItem, uint64_t> mqueue;
next_id(1),
dispatch_thread(this), // class DispatchThread : public Thread { dp = this )
local_delivery_lock("Messenger::DispatchQueue::local_delivery_lock" + name),
stop_local_delivery(false),
local_delivery_thread(this),
dispatch_throttler(cct, string("msgr_dispatch_throttler-") + name, cct->_conf->ms_dispatch_throttle_bytes),
stop(false)
//NetworkStack(c, t) 构造
NetworkStack::NetworkStack(CephContext *c, const string &t): type(t), started(false), cct©
|---num_workers = cct->_conf->ms_async_op_threads; // 从配置文件中获取工作线程个数
|---for (unsigned i = 0; i < num_workers; ++i)
|---Worker *w = create_worker(cct, type, i);
|---new PosixWorker(c, i) // PosixWorker构造
|---w->center.init(InitEventNumber, i, type) // EventCenter center.init
|---driver = new EpollDriver(cct)
|---r = driver->init(this, n) // EpollDriver::init
|---events = (struct epoll_event*)malloc(sizeof(struct epoll_event) * nevent);
|---memset(events, 0, sizeof(struct epoll_event)*nevent);
|---epfd = epoll_create(1024); /* 1024 is just an hint for the kernel */
|---r = net.set_nonblock(notify_receive_fd)
|---workers.push_back(w)
|---cct->register_fork_watcher(this)
|---_fork_watchers.push_back(w)
// PosixNetworkStack构造
PosixNetworkStack::PosixNetworkStack(CephContext *c, const string &t) : NetworkStack(c, t)
|---get_str_vec(cct->_conf->ms_async_affinity_cores, corestrs); // corestrs保存coreid
|---分配CPU
ceph通信(1)——AsyncMessenger构造
最新推荐文章于 2024-08-29 16:05:47 发布