]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: BackfillMachine does support cancel and resume now
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Mon, 9 Jan 2023 14:59:53 +0000 (14:59 +0000)
committerXuehan Xu <xuxuehan@qianxin.com>
Sat, 31 Aug 2024 13:24:12 +0000 (21:24 +0800)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/crimson/osd/backfill_state.cc
src/crimson/osd/backfill_state.h

index d015a77545cf4038f7bcef90fa8081e93c4197ae..70c43f49faf72ff9eba5fecd64a4db784305d2be 100644 (file)
@@ -101,6 +101,21 @@ BackfillState::Initial::react(const BackfillState::Triggered& evt)
   }
 }
 
+boost::statechart::result
+BackfillState::Cancelled::react(const BackfillState::Triggered& evt)
+{
+  logger().debug("{}: backfill re-triggered", __func__);
+  ceph_assert(peering_state().is_backfilling());
+  if (Enqueuing::all_enqueued(peering_state(),
+                              backfill_state().backfill_info,
+                              backfill_state().peer_backfill_info)) {
+    logger().debug("{}: switching to Done state", __func__);
+    return transit<BackfillState::Done>();
+  } else {
+    logger().debug("{}: switching to Enqueuing state", __func__);
+    return transit<BackfillState::Enqueuing>();
+  }
+}
 
 // -- Enqueuing
 void BackfillState::Enqueuing::maybe_update_range()
@@ -451,6 +466,15 @@ BackfillState::ReplicasScanning::react(ReplicaScanned evt)
   return discard_event();
 }
 
+boost::statechart::result
+BackfillState::ReplicasScanning::react(CancelBackfill evt)
+{
+  logger().debug("{}: cancelled within ReplicasScanning",
+                 __func__);
+  waiting_on_backfill.clear();
+  return transit<Cancelled>();
+}
+
 boost::statechart::result
 BackfillState::ReplicasScanning::react(ObjectPushed evt)
 {
@@ -499,11 +523,10 @@ BackfillState::Crashed::Crashed()
 }
 
 // -- Cancelled
-BackfillState::Cancelled::Cancelled()
+BackfillState::Cancelled::Cancelled(my_context ctx)
+  : my_base(ctx)
 {
-  backfill_state().backfill_info.clear();
-  backfill_state().peer_backfill_info.clear();
-  backfill_state().progress_tracker.reset();
+  ceph_assert(peering_state().get_backfill_targets().size());
 }
 
 // ProgressTracker is an intermediary between the BackfillListener and
index 4cdd4daafce6d479a4c36b4e424ff33d4469b792..6c36db81813b70fc8a8d5d6849d9e06edb398120 100644 (file)
@@ -135,9 +135,27 @@ public:
     explicit Crashed();
   };
 
-  struct Cancelled : sc::simple_state<Cancelled, BackfillMachine>,
-                    StateHelper<Cancelled> {
-    explicit Cancelled();
+  struct Cancelled : sc::state<Cancelled, BackfillMachine>,
+                     StateHelper<Cancelled> {
+    using reactions = boost::mpl::list<
+      sc::custom_reaction<Triggered>,
+      sc::custom_reaction<PrimaryScanned>,
+      sc::custom_reaction<ReplicaScanned>,
+      sc::custom_reaction<ObjectPushed>,
+      sc::transition<sc::event_base, Crashed>>;
+    explicit Cancelled(my_context);
+    // resume after triggering backfill by on_activate_complete().
+    // transit to Enqueuing.
+    sc::result react(const Triggered&);
+    sc::result react(const PrimaryScanned&) {
+      return discard_event();
+    }
+    sc::result react(const ReplicaScanned&) {
+      return discard_event();
+    }
+    sc::result react(const ObjectPushed&) {
+      return discard_event();
+    }
   };
 
   struct Initial : sc::state<Initial, BackfillMachine>,
@@ -159,6 +177,8 @@ public:
       sc::transition<RequestPrimaryScanning, PrimaryScanning>,
       sc::transition<RequestReplicasScanning, ReplicasScanning>,
       sc::transition<RequestWaiting, Waiting>,
+      sc::transition<RequestDone, Done>,
+      sc::transition<CancelBackfill, Cancelled>,
       sc::transition<sc::event_base, Crashed>>;
     explicit Enqueuing(my_context);
 
@@ -229,14 +249,15 @@ public:
     using reactions = boost::mpl::list<
       sc::custom_reaction<ObjectPushed>,
       sc::custom_reaction<ReplicaScanned>,
+      sc::custom_reaction<CancelBackfill>,
       sc::transition<RequestDone, Done>,
-      sc::transition<CancelBackfill, Cancelled>,
       sc::transition<sc::event_base, Crashed>>;
     explicit ReplicasScanning(my_context);
     // collect scanning result; if all results are collected, transition
     // to Enqueuing will happen.
     sc::result react(ObjectPushed);
     sc::result react(ReplicaScanned);
+    sc::result react(CancelBackfill);
 
     // indicate whether a particular peer should be scanned to retrieve
     // BackfillInterval for new range of hobject_t namespace.