加入队列
void OSD::ms_fast_dispatch(Message *m) //接受client发送到OSD的请求,并开始处理请求
|---service.is_stopping() //osd服务已经停止的话,则m->put(),nref减计数,计数减到0时?
//op的类型是 typedef boost::intrusive_ptr<OpRequest> Ref
|---OpRequestRef op = op_tracker.create_request<OpRequest, Message*>(m); //OpTracker op_tracker;
|---retval->tracking_start();
|---tracker->register_inflight_op(this)
|---
|---tracepoint(osd, ms_fast_dispatch, reqid.name._type, reqid.name._num, reqid.tid, reqid.inc); //tracepoint的作用?
|---op->osd_trace.init("osd op", &trace_endpoint, &m->trace); //如果m->trace
|---op->sent_epoch = static_cast<MOSDFastDispatchOp*>(m)->get_map_epoch();
|---op->min_epoch = static_cast<MOSDFastDispatchOp*>(m)->get_min_epoch();
|---获取epoch,什么是epoch?m的继承类是那些?
|---service.maybe_inject_dispatch_delay();
|---延时执行。
|---如果不是CEPH_MSG_OSD_OP消息 或者 has_features(CEPH_FEATUREMASK_RESEND_ON_SPLIT) 直接加入队列
//m->get_type() == CEPH_MSG_OSD_OP进行以下 流程处理
|---Session *session = static_cast<Session*>(m->get_connection()->get_priv())
|---op->get(); 加计数
|---session->waiting_on_map.push_back(*op); boost::intrusive::list<OpRequest> waiting_on_map
|---OSDMapRef nextmap = service.get_nextmap_reserved();
|---**dispatch_session_waiting**(session, nextmap);
|---m->get_min_epoch() 和 osdmap->get_epoch() 做比较
|---前者大于或者,则直接加入队列。只要有一个满足条件就break?
|---前者不大于或者,则进行一下流程
|---session->waiting_on_map.erase(i++) 从session中删除该op
|---op->put() //op加计数
|---spg_t pgid; //获取pgid
|---pg_t actual_pgid = osdmap->raw_pg_to_pg(static_cast<const MOSDOp*>(m)->get_pg());
|---if (!osdmap->get_primary_shard(actual_pgid, &pgid)) //如果不是主OSD则continue,结束流程
|---**pgid = m->get_spg()**; //主OSD,查找pgid
|---**enqueue_op**(pgid, op, m->get_map_epoch()) op is struct OpRequest : public TrackedOp
|---op->mark_queued_for_pg();
|---OpRequest::mark_flag_point
|---**op_shardedwq.queue**(T&& item) op_shardedwq is class ShardedOpWQ : public ShardedThreadPool::ShardedWQ<OpQueueItem>
|---**OSD::ShardedOpWQ::_enqueue**(OpQueueItem&& item)
/---sdata->pqueue->enqueue_strict(…) std::unique_ptr<OpQueue<OpQueueItem, uint64_t>> pqueue 优先队列
/---sdata->pqueue->enqueue(…)
|---sdata->sdata_cond.SignalOne();
|---pthread_cond_signal(&_c)
/---根据session map是否为空,处理对应的session map
|---service.release_map(nextmap);
|---pthread_cond_broadcast(&_c);
ceph——三副本读写流程——1
最新推荐文章于 2024-08-28 15:51:35 发布