diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 9e6b3fd9d92..46e8eb5e351 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -1875,14 +1875,21 @@ void OSDService::queue_scrub_next_chunk(PG *pg, Scrub::scrub_prio_t with_priorit queue_scrub_event_msg(pg, with_priority); } -void OSDService::queue_for_pg_delete(spg_t pgid, epoch_t e) +void OSDService::queue_for_pg_delete(spg_t pgid, epoch_t e, int64_t num_objects) { dout(10) << __func__ << " on " << pgid << " e " << e << dendl; + uint64_t cost_for_queue = [this, num_objects] { + if (op_queue_type_t::mClockScheduler == osd->osd_op_queue_type()) { + return num_objects * cct->_conf->osd_pg_delete_cost; + } else { + return cct->_conf->osd_pg_delete_cost; + } + }(); enqueue_back( OpSchedulerItem( unique_ptr( new PGDelete(pgid, e)), - cct->_conf->osd_pg_delete_cost, + cost_for_queue, cct->_conf->osd_pg_delete_priority, ceph_clock_now(), 0, @@ -10220,7 +10227,7 @@ void OSD::maybe_override_cost_for_qos() // If the scheduler enabled is mclock, override the default PG deletion cost // so that mclock can meet the QoS goals. if (op_queue_type_t::mClockScheduler == osd_op_queue_type()) { - uint64_t pg_delete_cost = 15728640; + uint64_t pg_delete_cost = 1048576; cct->_conf.set_val("osd_pg_delete_cost", std::to_string(pg_delete_cost)); } } diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 5f561e64318..6aface4b3ee 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -553,7 +553,7 @@ public: unsigned int qu_priority, Scrub::act_token_t act_token); - void queue_for_pg_delete(spg_t pgid, epoch_t e); + void queue_for_pg_delete(spg_t pgid, epoch_t e, int64_t num_objects); bool try_finish_pg_delete(PG *pg, unsigned old_pg_num); private: diff --git a/src/osd/PG.cc b/src/osd/PG.cc index cb12dae7c5b..7a6b7b01180 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -2665,7 +2665,8 @@ void PG::C_DeleteMore::complete(int r) { ceph_assert(r == 0); pg->lock(); if (!pg->pg_has_reset_since(epoch)) { - pg->osd->queue_for_pg_delete(pg->get_pgid(), epoch); + pg->osd->queue_for_pg_delete(pg->get_pgid(), epoch, + num_objects); } pg->unlock(); delete this; @@ -2689,7 +2690,9 @@ std::pair PG::do_delete_work( std::scoped_lock locker{*this}; delete_needs_sleep = false; if (!pg_has_reset_since(e)) { - osd->queue_for_pg_delete(get_pgid(), e); + // We pass 1 for num_objects here as only wpq uses this code path + // and it will be ignored + osd->queue_for_pg_delete(get_pgid(), e, 1); } }); @@ -2762,7 +2765,7 @@ std::pair PG::do_delete_work( bool running = true; if (num) { dout(20) << __func__ << " deleting " << num << " objects" << dendl; - Context *fin = new C_DeleteMore(this, get_osdmap_epoch()); + Context *fin = new C_DeleteMore(this, get_osdmap_epoch(), num); t.register_on_commit(fin); } else { if (cct->_conf->osd_inject_failure_on_pg_removal) { diff --git a/src/osd/PG.h b/src/osd/PG.h index 677f4e93a07..9abf92e9085 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -776,7 +776,9 @@ public: struct C_DeleteMore : public Context { PGRef pg; epoch_t epoch; - C_DeleteMore(PG *p, epoch_t e) : pg(p), epoch(e) {} + int64_t num_objects; + C_DeleteMore(PG *p, epoch_t e, int64_t num) : pg(p), epoch(e), + num_objects(num){} void finish(int r) override { ceph_abort(); } diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index ca83a563e4f..dea154144a5 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -12849,7 +12849,9 @@ void PrimaryLogPG::on_removal(ObjectStore::Transaction &t) on_shutdown(); - t.register_on_commit(new C_DeleteMore(this, get_osdmap_epoch())); + // starting PG deletion, num_objects can be 1 + // do_delete_work will update num_objects + t.register_on_commit(new C_DeleteMore(this, get_osdmap_epoch(), 1)); } void PrimaryLogPG::clear_async_reads()