From 261db722b74e7621ef4fb828859ccac0734f5316 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Tue, 26 Mar 2024 14:20:56 +0000 Subject: [PATCH] osd: squeeze RecoveryHandle out of ECCommon::RecoveryBackend Signed-off-by: Radoslaw Zarzynski (cherry picked from commit 1e0feb73a4b91bd8b7b3ecc164d28fe005b97ed1) --- src/osd/ECBackend.cc | 53 ++++++++++++++++++++++---------------------- src/osd/ECBackend.h | 8 +++++++ src/osd/ECCommon.h | 10 ++------- 3 files changed, 37 insertions(+), 34 deletions(-) diff --git a/src/osd/ECBackend.cc b/src/osd/ECBackend.cc index 7bc6b28649a..c5d5514d61b 100644 --- a/src/osd/ECBackend.cc +++ b/src/osd/ECBackend.cc @@ -63,8 +63,8 @@ static ostream &_prefix(std::ostream *_dout, ECBackend::RecoveryBackend *pgb) { return pgb->get_parent()->gen_dbg_prefix(*_dout); } -struct ECCommon::RecoveryBackend::ECRecoveryHandle : public PGBackend::RecoveryHandle { - list ops; +struct ECBackend::ECRecoveryBackend::ECRecoveryHandle : public PGBackend::RecoveryHandle { + list ops; }; void ECBackend::RecoveryBackend::RecoveryOp::dump(Formatter *f) const { @@ -121,7 +121,7 @@ ECBackend::RecoveryBackend::RecoveryBackend( read_pipeline(read_pipeline), parent(parent) {} -ECCommon::RecoveryBackend::ECRecoveryHandle *ECBackend::RecoveryBackend::open_recovery_op() { +ECBackend::ECRecoveryBackend::ECRecoveryHandle *ECBackend::ECRecoveryBackend::open_recovery_op() { return new ECRecoveryHandle; } @@ -740,14 +740,14 @@ void ECBackend::run_recovery_op( PGBackend::RecoveryHandle *_h, int priority) { ceph_assert(_h); - auto &h = static_cast(*_h); + auto &h = static_cast(*_h); recovery_backend.run_recovery_op(h, priority); switcher->send_recovery_deletes(priority, h.deletes); delete _h; } -void ECBackend::RecoveryBackend::run_recovery_op( - ECCommon::RecoveryBackend::ECRecoveryHandle &h, +void ECBackend::ECRecoveryBackend::run_recovery_op( + ECBackend::ECRecoveryBackend::ECRecoveryHandle &h, int priority) { RecoveryMessages m; for (list::iterator i = h.ops.begin(); @@ -767,50 +767,51 @@ int ECBackend::recover_object( ObjectContextRef head, ObjectContextRef obc, PGBackend::RecoveryHandle *_h) { - auto *h = static_cast(_h); - return recovery_backend.recover_object(hoid, v, head, obc, h); + auto *h = static_cast(_h); + h->ops.push_back(recovery_backend.recover_object(hoid, v, head, obc)); + return 0; } -int ECBackend::RecoveryBackend::recover_object( +ECCommon::RecoveryBackend::RecoveryOp +ECCommon::RecoveryBackend::recover_object( const hobject_t &hoid, eversion_t v, ObjectContextRef head, - ObjectContextRef obc, - ECCommon::RecoveryBackend::ECRecoveryHandle *h) { - h->ops.push_back(RecoveryOp()); - h->ops.back().v = v; - h->ops.back().hoid = hoid; - h->ops.back().obc = obc; - h->ops.back().recovery_info.soid = hoid; - h->ops.back().recovery_info.version = v; + ObjectContextRef obc) { + RecoveryOp op; + op.v = v; + op.hoid = hoid; + op.obc = obc; + op.recovery_info.soid = hoid; + op.recovery_info.version = v; if (obc) { - h->ops.back().recovery_info.size = obc->obs.oi.size; - h->ops.back().recovery_info.oi = obc->obs.oi; + op.recovery_info.size = obc->obs.oi.size; + op.recovery_info.oi = obc->obs.oi; } if (hoid.is_snap()) { if (obc) { ceph_assert(obc->ssc); - h->ops.back().recovery_info.ss = obc->ssc->snapset; + op.recovery_info.ss = obc->ssc->snapset; } else if (head) { ceph_assert(head->ssc); - h->ops.back().recovery_info.ss = head->ssc->snapset; + op.recovery_info.ss = head->ssc->snapset; } else { ceph_abort_msg("neither obc nor head set for a snap object"); } } - h->ops.back().recovery_progress.omap_complete = true; + op.recovery_progress.omap_complete = true; for (set::const_iterator i = get_parent()->get_acting_recovery_backfill_shards().begin(); i != get_parent()->get_acting_recovery_backfill_shards().end(); ++i) { dout(10) << "checking " << *i << dendl; if (get_parent()->get_shard_missing(*i).is_missing(hoid)) { - h->ops.back().missing_on.insert(*i); - h->ops.back().missing_on_shards.insert(i->shard); + op.missing_on.insert(*i); + op.missing_on_shards.insert(i->shard); } } - dout(10) << __func__ << ": built op " << h->ops.back() << dendl; - return 0; + dout(10) << __func__ << ": built op " << op << dendl; + return op; } bool ECBackend::can_handle_while_inactive( diff --git a/src/osd/ECBackend.h b/src/osd/ECBackend.h index a094477a959..4881043dcb2 100644 --- a/src/osd/ECBackend.h +++ b/src/osd/ECBackend.h @@ -192,6 +192,14 @@ class ECBackend : public ECCommon { parent->get_eclistener()), parent(parent) {} + struct ECRecoveryHandle; + + ECRecoveryHandle *open_recovery_op(); + + void run_recovery_op( + ECRecoveryHandle &h, + int priority); + void commit_txn_send_replies( ceph::os::Transaction &&txn, std::map replies) override; diff --git a/src/osd/ECCommon.h b/src/osd/ECCommon.h index dc1496b2557..a22ef5d0115 100644 --- a/src/osd/ECCommon.h +++ b/src/osd/ECCommon.h @@ -761,17 +761,11 @@ struct ECCommon { std::map replies) = 0; void dispatch_recovery_messages(RecoveryMessages &m, int priority); - struct ECRecoveryHandle; - ECRecoveryHandle *open_recovery_op(); - void run_recovery_op( - ECRecoveryHandle &h, - int priority); - int recover_object( + RecoveryBackend::RecoveryOp recover_object( const hobject_t &hoid, eversion_t v, ObjectContextRef head, - ObjectContextRef obc, - ECRecoveryHandle *h); + ObjectContextRef obc); void continue_recovery_op( RecoveryBackend::RecoveryOp &op, RecoveryMessages *m); -- 2.39.5