From: Samuel Just Date: Fri, 12 Apr 2019 23:34:25 +0000 (-0700) Subject: osd/: clean up PG deleted and deleting references X-Git-Tag: v15.1.0~2774^2~24 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=fd57e539a1e5484356464021bbb92175796f4c0e;p=ceph-ci.git osd/: clean up PG deleted and deleting references Signed-off-by: sjust@redhat.com --- diff --git a/src/crimson/common/.#log.cc b/src/crimson/common/.#log.cc new file mode 120000 index 00000000000..d141a2ab4eb --- /dev/null +++ b/src/crimson/common/.#log.cc @@ -0,0 +1 @@ +sam@pondermatic.4162:1552956455 \ No newline at end of file diff --git a/src/osd/PG.cc b/src/osd/PG.cc index db3a22ccd55..48fea1c5285 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -211,8 +211,6 @@ PG::PG(OSDService *o, OSDMapRef curmap, backfill_targets(recovery_state.backfill_targets), async_recovery_targets(recovery_state.async_recovery_targets), might_have_unfound(recovery_state.might_have_unfound), - deleting(recovery_state.deleting), - deleted(recovery_state.deleted), missing_loc(recovery_state.missing_loc), pg_id(p), coll(p), @@ -503,7 +501,7 @@ void PG::_finish_recovery(Context *c) lock(); // When recovery is initiated by a repair, that flag is left on state_clear(PG_STATE_REPAIR); - if (deleting) { + if (recovery_state.is_deleting()) { unlock(); return; } @@ -898,6 +896,7 @@ void PG::shutdown() { ch->flush(); lock(); + recovery_state.shutdown(); on_shutdown(); unlock(); } @@ -4078,7 +4077,7 @@ void PG::do_delete_work(ObjectStore::Transaction *t) dirty_info = true; dirty_big_info = true; } else { - deleted = true; + recovery_state.set_delete_complete(); // cancel reserver here, since the PG is about to get deleted and the // exit() methods don't run when that happens. diff --git a/src/osd/PG.h b/src/osd/PG.h index 438beb5e47a..e0023afb30f 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -208,8 +208,6 @@ protected: set &backfill_targets; set &async_recovery_targets; set &might_have_unfound; - bool &deleting; - atomic &deleted; MissingLoc &missing_loc; public: diff --git a/src/osd/PeeringState.h b/src/osd/PeeringState.h index 742cb6a499f..4f6e5c09893 100644 --- a/src/osd/PeeringState.h +++ b/src/osd/PeeringState.h @@ -1546,6 +1546,14 @@ public: last_persisted_osdmap = 0; } + void shutdown() { + deleting = true; + } + + void set_delete_complete() { + deleted = true; + } + template void adjust_purged_snaps(Func f) { f(info.purged_snaps); diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index 7ae79317a57..23c03e1af20 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -4636,7 +4636,7 @@ void PrimaryLogPG::snap_trimmer_scrub_complete() void PrimaryLogPG::snap_trimmer(epoch_t queued) { - if (deleting || pg_has_reset_since(queued)) { + if (recovery_state.is_deleting() || pg_has_reset_since(queued)) { return; } @@ -11593,7 +11593,7 @@ void PrimaryLogPG::_applied_recovered_object(ObjectContextRef obc) --active_pushes; // requeue an active chunky scrub waiting on recovery ops - if (!deleting && active_pushes == 0 + if (!recovery_state.is_deleting() && active_pushes == 0 && scrubber.is_chunky_scrub_active()) { requeue_scrub(ops_blocked_by_scrub()); } @@ -11606,7 +11606,7 @@ void PrimaryLogPG::_applied_recovered_object_replica() --active_pushes; // requeue an active chunky scrub waiting on recovery ops - if (!deleting && active_pushes == 0 && + if (!recovery_state.is_deleting() && active_pushes == 0 && scrubber.active_rep_scrub && static_cast( scrubber.active_rep_scrub->get_req())->chunky) { auto& op = scrubber.active_rep_scrub; @@ -12047,9 +12047,6 @@ void PrimaryLogPG::on_shutdown() { dout(10) << __func__ << dendl; - // handles queue races - deleting = true; - if (recovery_queued) { recovery_queued = false; osd->clear_queued_recovery(this); @@ -12378,7 +12375,7 @@ bool PrimaryLogPG::start_recovery_ops( bool recovery_started = false; ceph_assert(is_primary()); ceph_assert(is_peered()); - ceph_assert(!is_deleting()); + ceph_assert(!recovery_state.is_deleting()); ceph_assert(recovery_queued); recovery_queued = false; @@ -13916,7 +13913,7 @@ bool PrimaryLogPG::agent_work(int start_max, int agent_flush_quota) return true; } - ceph_assert(!deleting); + ceph_assert(!recovery_state.is_deleting()); if (agent_state->is_idle()) { dout(10) << __func__ << " idle, stopping" << dendl;