#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"
*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(
#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"
}
}
+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
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);