From b52f2bf9996e7676052087ea788b1e6a7a890bdc Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Fri, 29 Mar 2019 11:52:37 -0700 Subject: [PATCH] osd/: clarify recovery queueing from PeeringState Signed-off-by: Samuel Just --- src/osd/PG.cc | 27 +++++++++++++++++++++++++++ src/osd/PG.h | 5 +++++ src/osd/PeeringState.cc | 15 +++++---------- src/osd/PeeringState.h | 8 ++++++++ 4 files changed, 45 insertions(+), 10 deletions(-) diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 08ba2a7b2b0..ac2f84d0d00 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -3911,6 +3911,12 @@ void PG::cancel_remote_recovery_reservation() { pg_id); } +void PG::on_active_exit() +{ + backfill_reserving = false; + agent_stop(); +} + void PG::on_active_advmap(const OSDMapRef &osdmap) { if (osdmap->require_osd_release >= CEPH_RELEASE_MIMIC) { @@ -4013,6 +4019,27 @@ void PG::on_active_actmap() queue_recovery(); } } + +void PG::on_backfill_reserved() +{ + backfill_reserving = false; + queue_recovery(); +} + +void PG::on_backfill_canceled() +{ + if (!waiting_on_backfill.empty()) { + waiting_on_backfill.clear(); + finish_recovery_op(hobject_t::get_max()); + } +} + +void PG::on_recovery_reserved() +{ + queue_recovery(); +} + + void PG::do_replica_scrub_map(OpRequestRef op) { const MOSDRepScrubMap *m = static_cast(op->get_req()); diff --git a/src/osd/PG.h b/src/osd/PG.h index a795683755c..4306f0b84b6 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -448,10 +448,15 @@ public: PGPeeringEventRef on_preempt) override; void cancel_remote_recovery_reservation() override; + void on_active_exit() override; void on_active_actmap() override; void on_active_advmap(const OSDMapRef &osdmap) override; + void on_backfill_reserved() override; + void on_backfill_canceled() override; + void on_recovery_reserved() override; + bool is_forced_recovery_or_backfill() const { return recovery_state.is_forced_recovery_or_backfill(); } diff --git a/src/osd/PeeringState.cc b/src/osd/PeeringState.cc index a914b103208..a61060ceb3f 100644 --- a/src/osd/PeeringState.cc +++ b/src/osd/PeeringState.cc @@ -1462,7 +1462,7 @@ PeeringState::Backfilling::Backfilling(my_context ctx) DECLARE_LOCALS ps->backfill_reserved = true; - pg->queue_recovery(); + pl->on_backfill_reserved(); ps->state_clear(PG_STATE_BACKFILL_TOOFULL); ps->state_clear(PG_STATE_BACKFILL_WAIT); ps->state_set(PG_STATE_BACKFILLING); @@ -1491,10 +1491,7 @@ void PeeringState::Backfilling::cancel_backfill() { DECLARE_LOCALS backfill_release_reservations(); - if (!pg->waiting_on_backfill.empty()) { - pg->waiting_on_backfill.clear(); - pg->finish_recovery_op(hobject_t::get_max()); - } + pl->on_backfill_canceled(); } boost::statechart::result @@ -1572,7 +1569,6 @@ void PeeringState::Backfilling::exit() context< PeeringMachine >().log_exit(state_name, enter_time); DECLARE_LOCALS ps->backfill_reserved = false; - pg->backfill_reserving = false; ps->state_clear(PG_STATE_BACKFILLING); ps->state_clear(PG_STATE_FORCED_BACKFILL | PG_STATE_FORCED_RECOVERY); utime_t dur = ceph_clock_now() - enter_time; @@ -2201,9 +2197,9 @@ PeeringState::Recovering::Recovering(my_context ctx) ps->state_clear(PG_STATE_RECOVERY_WAIT); ps->state_clear(PG_STATE_RECOVERY_TOOFULL); ps->state_set(PG_STATE_RECOVERING); + pl->on_recovery_reserved(); ceph_assert(!ps->state_test(PG_STATE_ACTIVATING)); pl->publish_stats_to_osd(); - pg->queue_recovery(); } void PeeringState::Recovering::release_reservations(bool cancel) @@ -2693,7 +2689,7 @@ boost::statechart::result PeeringState::Active::react(const AllReplicasActivated pg->waiting_for_flush.swap(pg->waiting_for_peered); } - pg->on_activate(); + pl->on_activate(); return discard_event(); } @@ -2708,7 +2704,6 @@ void PeeringState::Active::exit() ps->blocked_by.clear(); ps->backfill_reserved = false; - pg->backfill_reserving = false; ps->state_clear(PG_STATE_ACTIVATING); ps->state_clear(PG_STATE_DEGRADED); ps->state_clear(PG_STATE_UNDERSIZED); @@ -2718,7 +2713,7 @@ void PeeringState::Active::exit() ps->state_clear(PG_STATE_RECOVERY_TOOFULL); utime_t dur = ceph_clock_now() - enter_time; pl->get_peering_perf().tinc(rs_active_latency, dur); - pg->agent_stop(); + pl->on_active_exit(); } /*------ReplicaActive-----*/ diff --git a/src/osd/PeeringState.h b/src/osd/PeeringState.h index f12214bb29a..ae06a29396f 100644 --- a/src/osd/PeeringState.h +++ b/src/osd/PeeringState.h @@ -113,16 +113,24 @@ public: virtual void check_blacklisted_watchers() = 0; virtual void clear_primary_state() = 0; + // Event notification virtual void on_pool_change() = 0; virtual void on_role_change() = 0; virtual void on_change(ObjectStore::Transaction *t) = 0; virtual void on_activate() = 0; virtual void on_new_interval() = 0; + virtual void on_active_exit() = 0; // active map notifications virtual void on_active_actmap() = 0; virtual void on_active_advmap(const OSDMapRef &osdmap) = 0; + + // recovery reservation notifications + virtual void on_backfill_reserved() = 0; + virtual void on_backfill_canceled() = 0; + virtual void on_recovery_reserved() = 0; + virtual epoch_t oldest_stored_osdmap() = 0; virtual LogChannel &get_clog() = 0; -- 2.39.5