]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd: bring factory to RecoveryBackend
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Tue, 19 Mar 2024 17:18:41 +0000 (17:18 +0000)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Tue, 27 Jan 2026 14:37:36 +0000 (14:37 +0000)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/crimson/osd/pg.cc
src/crimson/osd/recovery_backend.cc
src/crimson/osd/recovery_backend.h

index f9cf0b9df076eaf033bdcad55a965e7bf326e18c..dfb99101e032773f82a57b48468af92d157d2260 100644 (file)
@@ -38,6 +38,7 @@
 #include "crimson/os/cyanstore/cyan_store.h"
 #include "crimson/os/futurized_collection.h"
 #include "crimson/osd/ec_backend.h"
+#include "crimson/osd/ec_recovery_backend.h"
 #include "crimson/osd/exceptions.h"
 #include "crimson/osd/pg_meta.h"
 #include "crimson/osd/pg_backend.h"
@@ -120,8 +121,12 @@ PG::PG(
        *this,
        *this)),
     recovery_backend(
-      std::make_unique<ReplicatedRecoveryBackend>(
-       *this, shard_services, coll_ref, backend.get())),
+       RecoveryBackend::create(
+       pool,
+       *this,
+        shard_services,
+        coll_ref,
+        backend.get())),
     recovery_handler(
       std::make_unique<PGRecovery>(this)),
     peering_state(
index 9da41488fd49d930a343b84aa719e8a9e1fa4b0d..80fea74fe3fd454f0f1ada3fbb6452d2427bf624 100644 (file)
@@ -6,7 +6,9 @@
 #include "crimson/common/coroutine.h"
 #include "crimson/common/exception.h"
 #include "crimson/common/log.h"
+#include "crimson/osd/ec_recovery_backend.h"
 #include "crimson/osd/recovery_backend.h"
+#include "crimson/osd/replicated_recovery_backend.h"
 #include "crimson/osd/pg.h"
 #include "crimson/osd/pg_backend.h"
 #include "crimson/osd/osd_operations/background_recovery.h"
@@ -466,4 +468,24 @@ RecoveryBackend::handle_backfill_op(
   }
 }
 
+std::unique_ptr<RecoveryBackend> RecoveryBackend::create(
+  const pg_pool_t& pool,
+  crimson::osd::PG& pg,
+  crimson::osd::ShardServices& shard_services,
+  crimson::os::CollectionRef coll,
+  PGBackend* backend)
+{
+  switch (pool.type) {
+  case pg_pool_t::TYPE_REPLICATED:
+    return std::make_unique<ReplicatedRecoveryBackend>(
+      pg, shard_services, coll, backend);
+  case pg_pool_t::TYPE_ERASURE:
+    return std::make_unique<ECRecoveryBackend>(
+      pg, shard_services, coll, backend);
+  default:
+    ceph_abort_msg(seastar::format(
+      "unsupported pool type '{}'", pool.type));
+  }
 }
+
+} // namespace crimson::osd
index 7c6a56d45d7eef11ecaa7891f9630d7595242d70..7b6a7b5dfde3e4f35c68c496209f5acfaa48682f 100644 (file)
@@ -43,6 +43,14 @@ public:
       coll{coll},
       backend{backend} {}
   virtual ~RecoveryBackend() {}
+
+  static std::unique_ptr<RecoveryBackend> create(
+    const pg_pool_t& pool,
+    crimson::osd::PG& pg,
+    crimson::osd::ShardServices& shard_services,
+    crimson::os::CollectionRef coll,
+    PGBackend* backend);
+
   std::pair<WaitForObjectRecovery&, bool> add_recovering(const hobject_t& soid) {
     auto [it, added] = recovering.emplace(soid, new WaitForObjectRecovery(pg));
     assert(it->second);