ceph——三副本读写流程——1

加入队列
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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值