ceph通信(1)——AsyncMessenger构造

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值