}
}
+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()
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)
{
}
// -- 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
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>,
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);
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.