From: Xuehan Xu Date: Fri, 25 Aug 2023 06:42:52 +0000 (+0800) Subject: crimson/osd/backfill_state: consider backfills as complete when all X-Git-Tag: v20.0.0~1263^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=3d712181966a00a08a8c23a5f8aadd6536e5c104;p=ceph.git crimson/osd/backfill_state: consider backfills as complete when all replicas have acknowledged the finish of the backfill Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/osd/backfill_state.cc b/src/crimson/osd/backfill_state.cc index 46a270ffe54..f5f9eb37f95 100644 --- a/src/crimson/osd/backfill_state.cc +++ b/src/crimson/osd/backfill_state.cc @@ -73,6 +73,8 @@ BackfillState::Initial::Initial(my_context ctx) } ceph_assert(peering_state().get_backfill_targets().size()); ceph_assert(!backfill_state().last_backfill_started.is_max()); + backfill_state().replicas_in_backfill = + peering_state().get_backfill_targets().size(); } boost::statechart::result @@ -470,8 +472,6 @@ BackfillState::Waiting::react(ObjectPushed evt) backfill_state().backfill_info, backfill_state().peer_backfill_info)) { return transit(); - } else if (backfill_state().progress_tracker->tracked_objects_completed()) { - return transit(); } else { // we still have something to wait on logger().debug("Waiting::react() on ObjectPushed; still waiting"); diff --git a/src/crimson/osd/backfill_state.h b/src/crimson/osd/backfill_state.h index 4bd2991fb62..8c441f01abb 100644 --- a/src/crimson/osd/backfill_state.h +++ b/src/crimson/osd/backfill_state.h @@ -55,6 +55,9 @@ struct BackfillState { struct Triggered : sc::event { }; + struct RequestDone : sc::event { + }; + private: // internal events struct RequestPrimaryScanning : sc::event { @@ -66,9 +69,6 @@ private: struct RequestWaiting : sc::event { }; - struct RequestDone : sc::event { - }; - class ProgressTracker; public: @@ -149,7 +149,6 @@ public: sc::transition, sc::transition, sc::transition, - sc::transition, sc::transition>; explicit Enqueuing(my_context); @@ -206,6 +205,7 @@ public: using reactions = boost::mpl::list< sc::custom_reaction, sc::custom_reaction, + sc::transition, sc::transition>; explicit PrimaryScanning(my_context); sc::result react(ObjectPushed); @@ -218,6 +218,7 @@ public: using reactions = boost::mpl::list< sc::custom_reaction, sc::custom_reaction, + sc::transition, sc::transition>; explicit ReplicasScanning(my_context); // collect scanning result; if all results are collected, transition @@ -241,6 +242,7 @@ public: StateHelper { using reactions = boost::mpl::list< sc::custom_reaction, + sc::transition, sc::transition>; explicit Waiting(my_context); sc::result react(ObjectPushed); @@ -266,12 +268,21 @@ public: hobject_t get_last_backfill_started() const { return last_backfill_started; } + + void backfill_target_done() { + ceph_assert(replicas_in_backfill > 0); + replicas_in_backfill--; + if (!replicas_in_backfill) { + backfill_machine.process_event(RequestDone{}); + } + } private: hobject_t last_backfill_started; BackfillInterval backfill_info; std::map peer_backfill_info; BackfillMachine backfill_machine; std::unique_ptr progress_tracker; + size_t replicas_in_backfill = 0; }; // BackfillListener -- an interface used by the backfill FSM to request diff --git a/src/crimson/osd/pg_recovery.h b/src/crimson/osd/pg_recovery.h index 719d0ad2d34..a23f97004e2 100644 --- a/src/crimson/osd/pg_recovery.h +++ b/src/crimson/osd/pg_recovery.h @@ -36,6 +36,9 @@ public: void on_backfill_reserved(); void dispatch_backfill_event( boost::intrusive_ptr evt); + void backfill_target_finished() { + backfill_state->backfill_target_done(); + } seastar::future<> stop() { return seastar::now(); } private: diff --git a/src/crimson/osd/recovery_backend.cc b/src/crimson/osd/recovery_backend.cc index b5394bfdc48..9d480537089 100644 --- a/src/crimson/osd/recovery_backend.cc +++ b/src/crimson/osd/recovery_backend.cc @@ -117,8 +117,8 @@ RecoveryBackend::handle_backfill_finish_ack( logger().debug("{}", __func__); ceph_assert(pg.is_primary()); ceph_assert(crimson::common::local_conf()->osd_kill_backfill_at != 3); - // TODO: - // finish_recovery_op(hobject_t::get_max()); + auto recovery_handler = pg.get_recovery_handler(); + recovery_handler->backfill_target_finished(); return seastar::now(); } diff --git a/src/test/crimson/test_backfill.cc b/src/test/crimson/test_backfill.cc index 6d7d62ce5be..1ce9b42ad38 100644 --- a/src/test/crimson/test_backfill.cc +++ b/src/test/crimson/test_backfill.cc @@ -1,3 +1,6 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + #include #include #include @@ -308,6 +311,9 @@ void BackfillFixture::maybe_flush() void BackfillFixture::update_peers_last_backfill( const hobject_t& new_last_backfill) { + if (new_last_backfill.is_max()) { + schedule_event(crimson::osd::BackfillState::RequestDone{}); + } } bool BackfillFixture::budget_available() const @@ -355,6 +361,7 @@ TEST(backfill, same_primary_same_replica) reference_store.objs ).get_result(); + cluster_fixture.next_round(); cluster_fixture.next_round(); EXPECT_CALL(cluster_fixture, backfilled); cluster_fixture.next_round(); @@ -377,6 +384,7 @@ TEST(backfill, one_empty_replica) cluster_fixture.next_round(); cluster_fixture.next_round(); cluster_fixture.next_round(2); + cluster_fixture.next_round(); EXPECT_CALL(cluster_fixture, backfilled); cluster_fixture.next_round(); EXPECT_TRUE(cluster_fixture.all_stores_look_like(reference_store));