]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: implement the basics of SnapTrimEvent
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Wed, 16 Nov 2022 15:19:41 +0000 (15:19 +0000)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Tue, 28 Feb 2023 16:22:04 +0000 (16:22 +0000)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/crimson/osd/osd_operation_external_tracking.h
src/crimson/osd/osd_operations/common/pg_pipeline.h
src/crimson/osd/osd_operations/snaptrim_event.cc
src/crimson/osd/osd_operations/snaptrim_event.h
src/crimson/osd/pg.h

index 19b115b8563e4d290722d7114e42aaa77d05ef1f..2e0cbd01c92a2d9bd75b75fbc5ab1ba7d0c218bf 100644 (file)
@@ -11,6 +11,7 @@
 #include "crimson/osd/osd_operations/pg_advance_map.h"
 #include "crimson/osd/osd_operations/recovery_subrequest.h"
 #include "crimson/osd/osd_operations/replicated_request.h"
+#include "crimson/osd/osd_operations/snaptrim_event.h"
 #include "crimson/osd/pg_activation_blocker.h"
 #include "crimson/osd/pg_map.h"
 
index 20417d027747634bf30e11915b8ed48eef3678de..a5c0c9fbcb3d344b835496b94790d9156aeb94e2 100644 (file)
@@ -11,6 +11,7 @@ namespace crimson::osd {
 class CommonPGPipeline {
 protected:
   friend class InternalClientRequest;
+  friend class SnapTrimEvent;
 
   struct WaitForActive : OrderedExclusivePhaseT<WaitForActive> {
     static constexpr auto type_name = "CommonPGPipeline:::wait_for_active";
index d3fd67e45aea067e069a9c8d699dbdc086395f54..f7f489bc5483c0f545e7885727752797376a11f7 100644 (file)
@@ -10,6 +10,15 @@ namespace {
   }
 }
 
+namespace crimson {
+  template <>
+  struct EventBackendRegistry<osd::SnapTrimEvent> {
+    static std::tuple<> get_backends() {
+      return {};
+    }
+  };
+}
+
 namespace crimson::osd {
 
 void SnapTrimEvent::print(std::ostream &lhs) const
@@ -29,8 +38,56 @@ void SnapTrimEvent::dump_detail(Formatter *f) const
 
 seastar::future<> SnapTrimEvent::start()
 {
-  logger().debug("{}", __func__);
-  return seastar::now();
+  logger().debug("{}: {}", *this, __func__);
+  return with_pg(
+    pg->get_shard_services(), pg
+  ).finally([ref=IRef{this}, this] {
+    logger().debug("{}: complete", *ref);
+    return handle.complete();
+  });
+}
+
+CommonPGPipeline& SnapTrimEvent::pp()
+{
+  return pg->request_pg_pipeline;
+}
+
+seastar::future<> SnapTrimEvent::with_pg(
+  ShardServices &shard_services, Ref<PG> _pg)
+{
+  return interruptor::with_interruption([&shard_services, this] {
+    return enter_stage<interruptor>(
+      pp().wait_for_active
+    ).then_interruptible([this] {
+      return with_blocking_event<PGActivationBlocker::BlockingEvent,
+                                 interruptor>([this] (auto&& trigger) {
+        return pg->wait_for_active_blocker.wait(std::move(trigger));
+      });
+    }).then_interruptible([this] {
+      return enter_stage<interruptor>(
+        pp().recover_missing);
+    }).then_interruptible([] {
+      //return do_recover_missing(pg, get_target_oid());
+      return seastar::now();
+    }).then_interruptible([this] {
+      return enter_stage<interruptor>(
+        pp().get_obc);
+    }).then_interruptible([this] {
+      return enter_stage<interruptor>(
+        pp().process);
+    }).then_interruptible([&shard_services, this] {
+      std::vector<hobject_t> to_trim;
+      assert(!to_trim.empty());
+      for (const auto& object : to_trim) {
+        logger().debug("{}: trimming {}", object);
+        // TODO: start subop and add to subop blcoker
+      }
+      return seastar::now();
+    });
+  }, [this](std::exception_ptr eptr) {
+    // TODO: better debug output
+    logger().debug("{}: interrupted {}", *this, eptr);
+  }, pg);
 }
 
 } // namespace crimson::osd
index bcb20e48ddd84ae3fc4a23a207e09f25db378b24..f8e32b0baefac22807b5af319fe2ce53f45d3bc1 100644 (file)
@@ -8,7 +8,9 @@
 
 #include "crimson/osd/osdmap_gate.h"
 #include "crimson/osd/osd_operation.h"
-#include "crimson/osd/osd_operations/background_recovery.h"
+#include "crimson/osd/osd_operations/common/pg_pipeline.h"
+#include "crimson/osd/pg.h"
+#include "crimson/osd/pg_activation_blocker.h"
 #include "osd/osd_types.h"
 #include "osd/PGPeeringEvent.h"
 #include "osd/PeeringState.h"
@@ -38,8 +40,24 @@ public:
     ShardServices &shard_services, Ref<PG> pg);
 
 private:
+  CommonPGPipeline& pp();
+
+  PipelineHandle handle;
   Ref<PG> pg;
   const snapid_t snapid;
+
+public:
+  PipelineHandle& get_handle() { return handle; }
+
+  std::tuple<
+    StartEvent,
+    CommonPGPipeline::WaitForActive::BlockingEvent,
+    PGActivationBlocker::BlockingEvent,
+    CommonPGPipeline::RecoverMissing::BlockingEvent,
+    CommonPGPipeline::GetOBC::BlockingEvent,
+    CommonPGPipeline::Process::BlockingEvent,
+    CompletionEvent
+  > tracking_events;
 };
 
 } // namespace crimson::osd
index dd013e8db74a4ebd608c6e7a11df315fd82ecd52..f8be8e1cb5ed2ac620d1f1d962c2e123f10437a4 100644 (file)
@@ -720,6 +720,7 @@ private:
   friend struct PGFacade;
   friend class InternalClientRequest;
   friend class WatchTimeoutRequest;
+  friend class SnapTrimEvent;
 private:
   seastar::future<bool> find_unfound() {
     return seastar::make_ready_future<bool>(true);