Skip to content

Commit 48f2943

Browse files
committed
crimson/osd/pg_recovery: trigger BackfillState events synchronously
Fixes: https://tracker.ceph.com/issues/68306 Signed-off-by: Xuehan Xu <[email protected]>
1 parent c5cad5e commit 48f2943

File tree

3 files changed

+22
-19
lines changed

3 files changed

+22
-19
lines changed

src/crimson/osd/backfill_state.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,9 @@ struct BackfillState {
9696
BackfillListener& backfill_listener;
9797
std::unique_ptr<PeeringFacade> peering_state;
9898
std::unique_ptr<PGFacade> pg;
99+
void post_event(const sc::event_base &e) {
100+
sc::state_machine<BackfillMachine, Initial>::post_event(e);
101+
}
99102
};
100103

101104
private:
@@ -298,6 +301,10 @@ struct BackfillState {
298301
const std::vector<pg_shard_t> &peers);
299302

300303

304+
void post_event(boost::intrusive_ptr<const sc::event_base> evt) {
305+
backfill_machine.post_event(*std::move(evt));
306+
}
307+
301308
bool is_triggered() const {
302309
return backfill_machine.triggering_event() != nullptr;
303310
}

src/crimson/osd/pg_recovery.cc

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -477,17 +477,6 @@ void PGRecovery::_committed_pushed_object(epoch_t epoch,
477477
}
478478
}
479479

480-
template <class EventT>
481-
void PGRecovery::start_backfill_recovery(const EventT& evt)
482-
{
483-
using BackfillRecovery = crimson::osd::BackfillRecovery;
484-
std::ignore = pg->get_shard_services().start_operation<BackfillRecovery>(
485-
static_cast<crimson::osd::PG*>(pg),
486-
pg->get_shard_services(),
487-
pg->get_osdmap_epoch(),
488-
evt);
489-
}
490-
491480
void PGRecovery::request_replica_scan(
492481
const pg_shard_t& target,
493482
const hobject_t& begin,
@@ -520,7 +509,8 @@ void PGRecovery::request_primary_scan(
520509
).then_interruptible([this] (BackfillInterval bi) {
521510
logger().debug("request_primary_scan:{}", __func__);
522511
using BackfillState = crimson::osd::BackfillState;
523-
start_backfill_recovery(BackfillState::PrimaryScanned{ std::move(bi) });
512+
backfill_state->process_event(
513+
BackfillState::PrimaryScanned{ std::move(bi) }.intrusive_from_this());
524514
});
525515
}
526516

@@ -542,7 +532,13 @@ void PGRecovery::enqueue_push(
542532
}).then_interruptible([this, obj] {
543533
logger().debug("enqueue_push:{}", __func__);
544534
using BackfillState = crimson::osd::BackfillState;
545-
start_backfill_recovery(BackfillState::ObjectPushed(std::move(obj)));
535+
if (backfill_state->is_triggered()) {
536+
backfill_state->post_event(
537+
BackfillState::ObjectPushed(std::move(obj)).intrusive_from_this());
538+
} else {
539+
backfill_state->process_event(
540+
BackfillState::ObjectPushed(std::move(obj)).intrusive_from_this());
541+
}
546542
});
547543
}
548544

@@ -694,5 +690,6 @@ void PGRecovery::on_backfill_reserved()
694690
// it may be we either start a completely new backfill (first
695691
// event since last on_activate_complete()) or to resume already
696692
// (but stopped one).
697-
start_backfill_recovery(BackfillState::Triggered{});
693+
backfill_state->process_event(
694+
BackfillState::Triggered{}.intrusive_from_this());
698695
}

src/crimson/osd/recovery_backend.cc

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -335,11 +335,10 @@ RecoveryBackend::handle_scan_digest(
335335
bi.clear_objects();
336336
::decode_noclear(bi.objects, p);
337337
}
338-
shard_services.start_operation<crimson::osd::BackfillRecovery>(
339-
static_cast<crimson::osd::PG*>(&pg),
340-
shard_services,
341-
pg.get_osdmap_epoch(),
342-
crimson::osd::BackfillState::ReplicaScanned{ m.from, std::move(bi) });
338+
auto recovery_handler = pg.get_recovery_handler();
339+
recovery_handler->dispatch_backfill_event(
340+
crimson::osd::BackfillState::ReplicaScanned{
341+
m.from, std::move(bi) }.intrusive_from_this());
343342
return seastar::now();
344343
}
345344

0 commit comments

Comments
 (0)