From 1abc2320283e9247bec7b0821a6134f31b9b5e29 Mon Sep 17 00:00:00 2001 From: Neha Ojha Date: Mon, 21 May 2018 12:34:31 -0700 Subject: [PATCH] PG: add custom_reaction Backfilled and release reservations after backfill After backfill completes, we directly go to the Recovered state without releasing reservations. The outstanding reservations cause double reservation issues. Creating a custom_reaction Backfilled, allows us to release reservations, before transiting to the Recovered state. Signed-off-by: Neha Ojha --- src/osd/PG.cc | 15 +++++++++++++-- src/osd/PG.h | 4 +++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/osd/PG.cc b/src/osd/PG.cc index b915a6a4fdb..b88dc45bd49 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -7005,11 +7005,10 @@ PG::RecoveryState::Backfilling::Backfilling(my_context ctx) pg->publish_stats_to_osd(); } -void PG::RecoveryState::Backfilling::cancel_backfill() +void PG::RecoveryState::Backfilling::backfill_release_reservations() { PG *pg = context< RecoveryMachine >().pg; pg->osd->local_reserver.cancel_reservation(pg->info.pgid); - for (set::iterator it = pg->backfill_targets.begin(); it != pg->backfill_targets.end(); ++it) { @@ -7025,13 +7024,25 @@ void PG::RecoveryState::Backfilling::cancel_backfill() con.get()); } } +} +void PG::RecoveryState::Backfilling::cancel_backfill() +{ + PG *pg = context< RecoveryMachine >().pg; + backfill_release_reservations(); if (!pg->waiting_on_backfill.empty()) { pg->waiting_on_backfill.clear(); pg->finish_recovery_op(hobject_t::get_max()); } } +boost::statechart::result +PG::RecoveryState::Backfilling::react(const Backfilled &c) +{ + backfill_release_reservations(); + return transit(); +} + boost::statechart::result PG::RecoveryState::Backfilling::react(const DeferBackfill &c) { diff --git a/src/osd/PG.h b/src/osd/PG.h index 7b4f26d25ed..083056dff82 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -2278,7 +2278,7 @@ protected: struct Backfilling : boost::statechart::state< Backfilling, Active >, NamedState { typedef boost::mpl::list< - boost::statechart::transition< Backfilled, Recovered >, + boost::statechart::custom_reaction< Backfilled >, boost::statechart::custom_reaction< DeferBackfill >, boost::statechart::custom_reaction< UnfoundBackfill >, boost::statechart::custom_reaction< RemoteReservationRejected >, @@ -2291,6 +2291,8 @@ protected: post_event(RemoteReservationRevokedTooFull()); return discard_event(); } + void backfill_release_reservations(); + boost::statechart::result react(const Backfilled& evt); boost::statechart::result react(const RemoteReservationRevokedTooFull& evt); boost::statechart::result react(const RemoteReservationRevoked& evt); boost::statechart::result react(const DeferBackfill& evt); -- 2.39.5