]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd: settle BackfillState in PGRecovery.
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Tue, 5 May 2020 10:43:13 +0000 (12:43 +0200)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Mon, 13 Jul 2020 14:23:57 +0000 (16:23 +0200)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/crimson/osd/backfill_facades.h
src/crimson/osd/backfill_state.h
src/crimson/osd/osd_operations/background_recovery.cc
src/crimson/osd/osd_operations/background_recovery.h
src/crimson/osd/pg.h
src/crimson/osd/pg_recovery.cc
src/crimson/osd/pg_recovery.h

index 41faca5b92017166f9c7af628ee55561ec1eae31..645fc898737c445efcd3ffaf8ba027c909723610 100644 (file)
@@ -41,6 +41,10 @@ struct BackfillState::PeeringFacade {
                                              const pg_stat_t &stats) {
     return peering_state.update_complete_backfill_object_stats(hoid, stats);
   }
+
+  PeeringFacade(PeeringState& peering_state)
+    : peering_state(peering_state) {
+  }
 };
 
 // PGFacade -- a facade (in the GoF-defined meaning) simplifying the huge
@@ -52,6 +56,8 @@ struct BackfillState::PGFacade {
   decltype(auto) get_projected_last_update() const {
     return pg.projected_last_update;
   }
+
+  PGFacade(PG& pg) : pg(pg) {}
 };
 
 } // namespace crimson::osd
index a608a317bea4ee2cfb45b9b03aa7d0f3feba019e..50a72342dcbfc7f0535b14946e9e9883c3d680b5 100644 (file)
@@ -243,6 +243,11 @@ public:
                 std::unique_ptr<PGFacade> pg);
   ~BackfillState();
 
+  void process_event(
+    boost::intrusive_ptr<const sc::event_base> evt) {
+    backfill_machine.process_event(*std::move(evt));
+  }
+
 private:
   hobject_t last_backfill_started;
   BackfillInterval backfill_info;
index d8db74bc9d0ef8b0b91ee696e0eed0c36a91a7a1..f473e5a6ea5f824b03b5cbb9d611be09f480f75f 100644 (file)
@@ -108,4 +108,13 @@ seastar::future<bool> PglogBasedRecovery::do_recovery()
       crimson::common::local_conf()->osd_recovery_max_single_start));
 }
 
+seastar::future<bool> BackfillRecovery::do_recovery()
+{
+  if (pg->has_reset_since(epoch_started))
+    return seastar::make_ready_future<bool>(false);
+  // FIXME: blocking future, limits
+  pg->get_recovery_handler()->dispatch_backfill_event(std::move(evt));
+  return seastar::make_ready_future<bool>(false);
 }
+
+} // namespace crimson::osd
index 789d7b1901ae0c701fb2b086879744cccca35f15..235038544b9d7731495c08d53b1dab3a0e981a11 100644 (file)
@@ -72,4 +72,32 @@ public:
     epoch_t epoch_started);
 };
 
+class BackfillRecovery final : public BackgroundRecovery {
+  boost::intrusive_ptr<const boost::statechart::event_base> evt;
+  seastar::future<bool> do_recovery() override;
+
+public:
+  template <class EventT>
+  BackfillRecovery(
+    Ref<PG> pg,
+    ShardServices &ss,
+    epoch_t epoch_started,
+    const EventT& evt);
+};
+
+template <class EventT>
+BackfillRecovery::BackfillRecovery(
+  Ref<PG> pg,
+  ShardServices &ss,
+  const epoch_t epoch_started,
+  const EventT& evt)
+  : BackgroundRecovery(
+      std::move(pg),
+      ss,
+      epoch_started,
+      crimson::osd::scheduler::scheduler_class_t::background_best_effort),
+    evt(evt.intrusive_from_this())
+{}
+
+
 }
index 0c8a70620092c1de5e22ab6da2f540ba3b84cb8a..647f989bc2da315a157072ae28ca113a55fd8824 100644 (file)
@@ -344,7 +344,7 @@ public:
   }
 
   void on_backfill_reserved() final {
-    ceph_assert(0 == "Not implemented");
+    recovery_handler->on_backfill_reserved();
   }
   void on_backfill_canceled() final {
     ceph_assert(0 == "Not implemented");
index 1fd67a8de033a487621d9a4bd706b33e71c0eeda..ec25b3fe70ff5e219f6b7936f0158c869b509a35 100644 (file)
@@ -5,6 +5,7 @@
 #include <fmt/ostream.h>
 
 #include "crimson/common/type_helpers.h"
+#include "crimson/osd/backfill_facades.h"
 #include "crimson/osd/osd_operations/background_recovery.h"
 #include "crimson/osd/osd_operations/peering_event.h"
 #include "crimson/osd/pg.h"
@@ -445,3 +446,29 @@ void PGRecovery::backfilled()
 {
   ceph_abort_msg("Not implemented");
 }
+
+void PGRecovery::dispatch_backfill_event(
+  boost::intrusive_ptr<const boost::statechart::event_base> evt)
+{
+  logger().debug("{}", __func__);
+  backfill_state->process_event(evt);
+}
+
+void PGRecovery::on_backfill_reserved()
+{
+  logger().debug("{}", __func__);
+  // PIMP and depedency injection for the sake unittestability.
+  // I'm not afraid about the performance here.
+  using BackfillState = crimson::osd::BackfillState;
+  backfill_state = std::make_unique<BackfillState>(
+    *this,
+    std::make_unique<BackfillState::PeeringFacade>(pg->get_peering_state()),
+    std::make_unique<BackfillState::PGFacade>(
+      *static_cast<crimson::osd::PG*>(pg)));
+  using BackfillRecovery = crimson::osd::BackfillRecovery;
+  pg->get_shard_services().start_operation<BackfillRecovery>(
+    static_cast<crimson::osd::PG*>(pg),
+    pg->get_shard_services(),
+    pg->get_osdmap_epoch(),
+    BackfillState::Triggered{});
+}
index afa64dc1e3e824fe60a6bfa0bd9a74ac3b44c7f4..67a87f12b1ea92f23900e7ba967614d7d1b7a001 100644 (file)
@@ -22,6 +22,10 @@ public:
   void start_pglogbased_recovery();
 
   crimson::osd::blocking_future<bool> start_recovery_ops(size_t max_to_start);
+  void on_backfill_reserved();
+  void dispatch_backfill_event(
+    boost::intrusive_ptr<const boost::statechart::event_base> evt);
+
   seastar::future<> stop() { return seastar::now(); }
 private:
   PGRecoveryListener* pg;
@@ -77,6 +81,8 @@ private:
   seastar::future<> handle_scan(MOSDPGScan& m);
 
   // backfill begin
+  std::unique_ptr<crimson::osd::BackfillState> backfill_state;
+
   void request_replica_scan(
     const pg_shard_t& target,
     const hobject_t& begin,