From 13674901150b6554ec33fa057e07553cc2f4e586 Mon Sep 17 00:00:00 2001 From: Matan Breizman Date: Wed, 4 Jan 2023 12:45:51 +0000 Subject: [PATCH] crimson/osd/replicated_recovery_backend: handle_pull_response() - recalc_subsets() Signed-off-by: Matan Breizman --- .../osd/replicated_recovery_backend.cc | 27 +++++++++++++++++-- src/crimson/osd/replicated_recovery_backend.h | 3 +++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/crimson/osd/replicated_recovery_backend.cc b/src/crimson/osd/replicated_recovery_backend.cc index f78994e8a5af5..1ff0623abdc05 100644 --- a/src/crimson/osd/replicated_recovery_backend.cc +++ b/src/crimson/osd/replicated_recovery_backend.cc @@ -799,11 +799,23 @@ ReplicatedRecoveryBackend::_handle_pull_response( if (pull_info.recovery_progress.first) { prepare_waiter = pg.obc_loader.with_obc( pull_info.recovery_info.soid, - [&pull_info, &recovery_waiter, &push_op](auto, auto obc) { + [this, &pull_info, &recovery_waiter, &push_op](auto, auto obc) { pull_info.obc = obc; recovery_waiter.obc = obc; - obc->obs.oi.decode_no_oid(push_op.attrset.at(OI_ATTR), push_op.soid); + obc->obs.oi.decode_no_oid(push_op.attrset.at(OI_ATTR), + push_op.soid); + if (push_op.attrset.contains(SS_ATTR)) { + bufferlist ssbl = push_op.attrset.at(SS_ATTR); + SnapSet ss(ssbl); + assert(!pull_info.obc->ssc->exists || + ss.seq == pull_info.obc->ssc->snapset.seq); + } pull_info.recovery_info.oi = obc->obs.oi; + if (pull_info.recovery_info.soid.snap && + pull_info.recovery_info.soid.snap < CEPH_NOSNAP) { + recalc_subsets(pull_info.recovery_info, + pull_info.obc->ssc); + } return crimson::osd::PG::load_obc_ertr::now(); }).handle_error_interruptible(crimson::ct_error::assert_all{}); }; @@ -857,6 +869,17 @@ ReplicatedRecoveryBackend::_handle_pull_response( }); } +void ReplicatedRecoveryBackend::recalc_subsets( + ObjectRecoveryInfo& recovery_info, + crimson::osd::SnapSetContextRef ssc) +{ + assert(ssc); + auto subsets = crimson::osd::calc_clone_subsets( + ssc->snapset, recovery_info.soid, pg.get_local_missing(), + pg.get_info().last_backfill); + crimson::osd::set_subsets(subsets, recovery_info); +} + RecoveryBackend::interruptible_future<> ReplicatedRecoveryBackend::handle_pull_response( Ref m) diff --git a/src/crimson/osd/replicated_recovery_backend.h b/src/crimson/osd/replicated_recovery_backend.h index 8faed2fbf3f29..cd1d9e067289e 100644 --- a/src/crimson/osd/replicated_recovery_backend.h +++ b/src/crimson/osd/replicated_recovery_backend.h @@ -82,6 +82,9 @@ protected: PushOp& push_op, PullOp* response, ceph::os::Transaction* t); + void recalc_subsets( + ObjectRecoveryInfo& recovery_info, + crimson::osd::SnapSetContextRef ssc); std::pair, ceph::bufferlist> trim_pushed_data( const interval_set ©_subset, const interval_set &intervals_received, -- 2.39.5