]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd/pg: Let PGListener use start_peering_event_operation
authorMatan Breizman <mbreizma@redhat.com>
Thu, 24 Apr 2025 07:57:00 +0000 (07:57 +0000)
committerMatan Breizman <mbreizma@redhat.com>
Sun, 4 May 2025 14:32:12 +0000 (14:32 +0000)
PG::start_peering_event_operation is a template function while
PGRecovery::pg is of PGRecoveryListener* type. We can't expose a template
function through the PGRecoveryListener interface since it must be
also virtual.
Instead, introduce start_peering_event_operation_listener which will act
as a wrapper to PG::start_peering_event_operation for PGRecovery to use
freely.

Signed-off-by: Matan Breizman <mbreizma@redhat.com>
src/crimson/osd/pg_recovery.cc
src/crimson/osd/pg_recovery.h
src/crimson/osd/pg_recovery_listener.h

index 8d14cb77eaa2770843084ad6b521323c6b0d7fd1..fd6c1097dffbc568bac9045ac0306087622628f8 100644 (file)
@@ -623,32 +623,28 @@ void PGRecovery::on_pg_clean()
   backfill_state.reset();
 }
 
+// PGListener wrapper to PG::start_peering_event_operation
+template <typename T>
+void PGRecovery::start_peering_event_operation_listener(T &&evt, float delay) {
+  (void) pg->schedule_event_after(PGPeeringEventRef(
+    std::make_shared<PGPeeringEvent>(
+      pg->get_osdmap_epoch(),
+      pg->get_osdmap_epoch(),
+      std::forward<T>(evt))), delay);
+}
+
 void PGRecovery::backfilled()
 {
   LOG_PREFIX(PGRecovery::backfilled);
   DEBUGDPP("", pg->get_pgid());
-  using LocalPeeringEvent = crimson::osd::LocalPeeringEvent;
-  std::ignore = pg->get_shard_services().start_operation<LocalPeeringEvent>(
-    static_cast<crimson::osd::PG*>(pg),
-    pg->get_pg_whoami(),
-    pg->get_pgid(),
-    pg->get_osdmap_epoch(),
-    pg->get_osdmap_epoch(),
-    PeeringState::Backfilled{});
+  start_peering_event_operation_listener(PeeringState::Backfilled());
 }
 
 void PGRecovery::request_backfill()
 {
   LOG_PREFIX(PGRecovery::request_backfill);
   DEBUGDPP("", pg->get_pgid());
-  using LocalPeeringEvent = crimson::osd::LocalPeeringEvent;
-  std::ignore = pg->get_shard_services().start_operation<LocalPeeringEvent>(
-    static_cast<crimson::osd::PG*>(pg),
-    pg->get_pg_whoami(),
-    pg->get_pgid(),
-    pg->get_osdmap_epoch(),
-    pg->get_osdmap_epoch(),
-    PeeringState::RequestBackfill{});
+  start_peering_event_operation_listener(PeeringState::RequestBackfill());
 }
 
 
@@ -656,14 +652,7 @@ void PGRecovery::all_replicas_recovered()
 {
   LOG_PREFIX(PGRecovery::all_replicas_recovered);
   DEBUGDPP("", pg->get_pgid());
-  using LocalPeeringEvent = crimson::osd::LocalPeeringEvent;
-  std::ignore = pg->get_shard_services().start_operation<LocalPeeringEvent>(
-    static_cast<crimson::osd::PG*>(pg),
-    pg->get_pg_whoami(),
-    pg->get_pgid(),
-    pg->get_osdmap_epoch(),
-    pg->get_osdmap_epoch(),
-    PeeringState::AllReplicasRecovered{});
+  start_peering_event_operation_listener(PeeringState::AllReplicasRecovered());
 }
 
 void PGRecovery::backfill_suspended()
index 9bddbcf75ec87b25a7753d25462eddaf5301b1f6..f85709c501d07bca49802682b42987b1ea55091a 100644 (file)
@@ -138,7 +138,8 @@ private:
     const hobject_t& new_last_backfill) final;
   bool budget_available() const final;
 
-  // TODO: move to start_peering_event_operation
+  template <typename T>
+  void start_peering_event_operation_listener(T &&evt, float delay = 0);
   void backfilled() final;
   void request_backfill();
   void all_replicas_recovered();
index 347a3b2194e3187f3c324ac87ddc1151526fa137..ab50b99a639fd0e3aaba6e4e3a7cc4cb96ed0313 100644 (file)
@@ -43,4 +43,5 @@ public:
   virtual void set_pglog_based_recovery_op(
     crimson::osd::PglogBasedRecovery *op) = 0;
   virtual void reset_pglog_based_recovery_op() = 0;
+  virtual void schedule_event_after(PGPeeringEventRef evt, float delay) = 0;
 };