From: Radoslaw Zarzynski Date: Mon, 9 Jan 2023 14:59:53 +0000 (+0000) Subject: crimson/osd: BackfillMachine does support cancel and resume now X-Git-Tag: v20.0.0~1148^2~3 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=8e5da475446eedcfb2af2958013190527d4e1a22;p=ceph.git crimson/osd: BackfillMachine does support cancel and resume now Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/crimson/osd/backfill_state.cc b/src/crimson/osd/backfill_state.cc index d015a77545cf4..70c43f49faf72 100644 --- a/src/crimson/osd/backfill_state.cc +++ b/src/crimson/osd/backfill_state.cc @@ -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(); + } else { + logger().debug("{}: switching to Enqueuing state", __func__); + return transit(); + } +} // -- 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(); +} + 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 diff --git a/src/crimson/osd/backfill_state.h b/src/crimson/osd/backfill_state.h index 4cdd4daafce6d..6c36db81813b7 100644 --- a/src/crimson/osd/backfill_state.h +++ b/src/crimson/osd/backfill_state.h @@ -135,9 +135,27 @@ public: explicit Crashed(); }; - struct Cancelled : sc::simple_state, - StateHelper { - explicit Cancelled(); + struct Cancelled : sc::state, + StateHelper { + using reactions = boost::mpl::list< + sc::custom_reaction, + sc::custom_reaction, + sc::custom_reaction, + sc::custom_reaction, + sc::transition>; + 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, @@ -159,6 +177,8 @@ public: sc::transition, sc::transition, sc::transition, + sc::transition, + sc::transition, sc::transition>; explicit Enqueuing(my_context); @@ -229,14 +249,15 @@ public: using reactions = boost::mpl::list< sc::custom_reaction, sc::custom_reaction, + sc::custom_reaction, sc::transition, - sc::transition, sc::transition>; 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.