ceph——三副本读写——2

处理线程
void OSD::ShardedOpWQ::_process(uint32_t thread_index, heartbeat_handle_d *hb)
|---auto& sdata = osd->shards[shard_index];    //vector<OSDShard*> shards;
|---if (sdata->pqueue->empty())    //队列为空时的处理
    |---if (!sdata->stop_waiting)
        |---
//std::unique_ptr<OpQueue<OpQueueItem, uint64_t>> pqueue;
//class PrioritizedQueue : public OpQueue <T, K> 或 class WeightedPriorityQueue :  public OpQueue <T, K>
|---OpQueueItem item = sdata->pqueue->dequeue()   出队
|---osd->is_stopping() 则 return    // OSD shutdown, discard
|---const auto token = item.get_ordering_token();  
    |---item->OpQueueable::Ref qitem;
    |---const spg_t& get_ordering_token() const override final
    |---class PGOpQueueable : public OpQueueItem::OpQueueable    qitem 
    |---获取pgid  spg_t
|---OSDShardPGSlot *slot = r.first->second.get()
|---PGRef pg = slot->pg
|---ThreadPool::TPHandle tp_handle(osd->cct, hb, timeout_interval, suicide_interval);
|---auto qi = std::move(slot->to_process.front());   //qi是什么? deque<OpQueueItem> to_process;
|---slot->to_process.pop_front()
|---set<spg_t> new_children;  OSDMapRef osdmap
|---while (!pg) 
    |---osdmap = sdata->shard_osdmap; 
    |---const PGCreateInfo *create_info = qi.creates_pg();
    |---if (slot->waiting_for_split) 
        |---_add_slot_waiter(token, slot, std::move(qi))
    |---else if (qi.get_map_epoch() > osdmap->get_epoch())
        |---_add_slot_waiter(token, slot, std::move(qi))
    |---else if (qi.is_peering())     peering时
        |---if (!qi.peering_requires_pg())
            |---qi.run(osd, sdata, pg, tp_handle)
        |---else if (osdmap->is_up_acting_osd_shard(token, osd->whoami))
            |---if (create_info) 
                |---if (create_info->by_mon && osdmap->get_pg_acting_primary(token.pgid) != osd->whoami) 不成立
                    |---pg = osd->handle_pg_create_info(osdmap, create_info)
                    |---if (pg) 
                        |---osd->service.identify_split_children(pg->get_osdmap(), osdmap, pg->pg_id, &new_children);
                        |---break
        |---else if (osdmap->is_up_acting_osd_shard(token, osd->whoami))
            |---_add_slot_waiter(token, slot, std::move(qi));
        |---else  pg不存在
            |---if (boost::optional<OpRequestRef> _op = qi.maybe_get_op())
                |---if (auto session = static_cast<Session *>(priv.get()); session) 
                    |---osd->maybe_share_map(session, *_op, sdata->shard_osdmap);
                        |---
            |---pushes_to_free = qi.get_reserved_pushes();
            |---if (pushes_to_free > 0) 
                |---osd->service.release_reserved_pushes(pushes_to_free); return
|---if (qi.is_peering())
    |---if (qi.get_map_epoch() > osdmap->get_epoch())
        |---_add_slot_waiter(token, slot, std::move(qi)) 
        |---return
|---qi.run(osd, sdata, pg, tp_handle)    //处理线程  PGOpItem::run
    |---osd->dequeue_op(pg, op, handle);  //dequeue called in worker thread, with pg lock
        |---priv = op->get_req()->get_connection()->get_priv()
        |---session = static_cast<Session *>(priv.get())
        |---if (session)
            |---maybe_share_map(session, op, pg->get_osdmap())
        |---if (pg->is_deleting())
            |---return
        |---pg->do_request(op, handle)    //处理请求  PrimaryLogPG::do_request
            |---if (p != waiting_for_map.end())
                |---op->mark_delayed("waiting_for_map not empty"); return
            |---if (!have_same_or_newer_map(op->min_epoch)) 
                |---op->mark_delayed("op must wait for map");
                |---osd->request_osdmap_update(op->min_epoch); return
                    |---更新map
            |---if (can_discard_request(op))  条件成立 return
                |---can_discard_op     case CEPH_MSG_OSD_OP
                    |---
            |---if (m->get_connection()->has_feature(CEPH_FEATURE_RADOS_BACKOFF))
                |---if (backoff)
                    |---add_pg_backoff(session); return  //稍后处理
                |---if (msg_type == CEPH_MSG_OSD_BACKOFF)
                    |---if (ba->begin != ba->end)
                        |---handle_backoff(op); return  //处理backoff的pg
            |---if (!is_peered())
                |---if ( ! pgbackend->can_handle_while_inactive(op))
                    |---waiting_for_peered.push_back(op);
            |---if (flushes_in_progress > 0)
                |--- waiting_for_flush.push_back(op);    //pg处于flash状态,将op放入等待队列,等待pg变为可用状态
            |---case CEPH_MSG_OSD_OP:
                |---if ((pool.info.has_tiers() || pool.info.is_tier()) && !op->has_feature(CEPH_FEATURE_OSD_CACHEPOOL)) 
                    |---osd->reply_op_error(op, -EOPNOTSUPP);  return
|---do_op(op)    PrimaryLogPG::do_op(OpRequestRef& op)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值