]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
osd/: clarify recovery queueing from PeeringState
authorSamuel Just <sjust@redhat.com>
Fri, 29 Mar 2019 18:52:37 +0000 (11:52 -0700)
committersjust@redhat.com <sjust@redhat.com>
Wed, 1 May 2019 18:22:20 +0000 (11:22 -0700)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/osd/PG.cc
src/osd/PG.h
src/osd/PeeringState.cc
src/osd/PeeringState.h

index 08ba2a7b2b0d6367fc97cf333575c239b842d740..ac2f84d0d005001af5d29b8870a84d5c67555ea2 100644 (file)
@@ -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<const MOSDRepScrubMap*>(op->get_req());
index a795683755c56988f4c84b889e0d5a961e4fb459..4306f0b84b6fa377df5d9af172a22617efc1bb5e 100644 (file)
@@ -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();
   }
index a914b103208473119379c6c706b515f267cf7e39..a61060ceb3f6703e65c01df643411e1958669d33 100644 (file)
@@ -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-----*/
index f12214bb29a5112292686a817d3b27ed0343907b..ae06a29396f7f785c95fee0c7308c0715b762bbd 100644 (file)
@@ -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;