处理线程
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)
ceph——三副本读写——2
最新推荐文章于 2024-08-28 15:51:35 发布