]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.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, 24 Mar 2026 16:06:24 +0000 (16:06 +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 9a0779d8ed37a05d4b8e6550b739594c52df81e5..504ce217d751a5cdd2b8a952188d005415f6b547 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"
@@ -122,8 +123,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 eeb94e0a34f17fc1104995540a6ca36a2a9faddc..a47e98f8069d08c2f0486aff5b569613de633971 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"
@@ -468,4 +470,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 0b49604f3dc17aa3f23e6ce249cb7e856760f831..e1aef7c63d521c695cbbead6c6f5ea590164e98d 100644 (file)
@@ -44,6 +44,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);