]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
PG: add custom_reaction Backfilled and release reservations after backfill 23493/head
authorNeha Ojha <nojha@redhat.com>
Mon, 21 May 2018 19:34:31 +0000 (12:34 -0700)
committerVictor Denisov <denisovenator@gmail.com>
Tue, 9 Oct 2018 02:40:53 +0000 (19:40 -0700)
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 <nojha@redhat.com>
(cherry picked from commit 1abc2320283e9247bec7b0821a6134f31b9b5e29)

Conflicts:
        src/osd/PG.cc
        src/osd/PG.h

src/osd/PG.cc
src/osd/PG.h

index 95a9b7f64d2ccb73ad2f06e72cc2f314f7504d00..6581cc2988b9eca7872d20be9bbbcb340711649e 100644 (file)
@@ -6839,6 +6839,29 @@ PG::RecoveryState::Backfilling::Backfilling(my_context ctx)
   pg->publish_stats_to_osd();
 }
 
+boost::statechart::result
+PG::RecoveryState::Backfilling::react(const Backfilled &c)
+{
+  PG *pg = context< RecoveryMachine >().pg;
+  pg->osd->local_reserver.cancel_reservation(pg->info.pgid);
+  for (set<pg_shard_t>::iterator it = pg->backfill_targets.begin();
+       it != pg->backfill_targets.end();
+       ++it) {
+    assert(*it != pg->pg_whoami);
+    ConnectionRef con = pg->osd->get_con_osd_cluster(
+      it->osd, pg->get_osdmap()->get_epoch());
+    if (con) {
+      pg->osd->send_message_osd_cluster(
+        new MBackfillReserve(
+         MBackfillReserve::REJECT,
+         spg_t(pg->info.pgid.pgid, it->shard),
+         pg->get_osdmap()->get_epoch()),
+       con.get());
+    }
+  }
+  return transit<Recovered>();
+}
+
 boost::statechart::result
 PG::RecoveryState::Backfilling::react(const DeferBackfill &c)
 {
@@ -6864,13 +6887,10 @@ PG::RecoveryState::Backfilling::react(const DeferBackfill &c)
        con.get());
     }
   }
-
-
   if (!pg->waiting_on_backfill.empty()) {
     pg->waiting_on_backfill.clear();
     pg->finish_recovery_op(hobject_t::get_max());
   }
-
   pg->schedule_backfill_retry(c.delay);
   return transit<NotBackfilling>();
 }
index 212da4d7ed386bebfccaf7b19ac7d68870ec33cc..12bf9e977836ab6d37be4c33aa293d4210cf57f3 100644 (file)
@@ -2109,13 +2109,14 @@ 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 >
        > reactions;
       explicit Backfilling(my_context ctx);
       boost::statechart::result react(const RemoteReservationRejected& evt);
+      boost::statechart::result react(const Backfilled& evt);
       boost::statechart::result react(const DeferBackfill& evt);
       boost::statechart::result react(const UnfoundBackfill& evt);
       void exit();