@@ -799,11 +799,23 @@ ReplicatedRecoveryBackend::_handle_pull_response(
799799 if (pull_info.recovery_progress .first ) {
800800 prepare_waiter = pg.obc_loader .with_obc <RWState::RWNONE>(
801801 pull_info.recovery_info .soid ,
802- [&pull_info, &recovery_waiter, &push_op](auto , auto obc) {
802+ [this , &pull_info, &recovery_waiter, &push_op](auto , auto obc) {
803803 pull_info.obc = obc;
804804 recovery_waiter.obc = obc;
805- obc->obs .oi .decode_no_oid (push_op.attrset .at (OI_ATTR), push_op.soid );
805+ obc->obs .oi .decode_no_oid (push_op.attrset .at (OI_ATTR),
806+ push_op.soid );
807+ if (push_op.attrset .contains (SS_ATTR)) {
808+ bufferlist ssbl = push_op.attrset .at (SS_ATTR);
809+ SnapSet ss (ssbl);
810+ assert (!pull_info.obc ->ssc ->exists ||
811+ ss.seq == pull_info.obc ->ssc ->snapset .seq );
812+ }
806813 pull_info.recovery_info .oi = obc->obs .oi ;
814+ if (pull_info.recovery_info .soid .snap &&
815+ pull_info.recovery_info .soid .snap < CEPH_NOSNAP) {
816+ recalc_subsets (pull_info.recovery_info ,
817+ pull_info.obc ->ssc );
818+ }
807819 return crimson::osd::PG::load_obc_ertr::now ();
808820 }).handle_error_interruptible (crimson::ct_error::assert_all{});
809821 };
@@ -857,6 +869,17 @@ ReplicatedRecoveryBackend::_handle_pull_response(
857869 });
858870}
859871
872+ void ReplicatedRecoveryBackend::recalc_subsets (
873+ ObjectRecoveryInfo& recovery_info,
874+ crimson::osd::SnapSetContextRef ssc)
875+ {
876+ assert (ssc);
877+ auto subsets = crimson::osd::calc_clone_subsets (
878+ ssc->snapset , recovery_info.soid , pg.get_local_missing (),
879+ pg.get_info ().last_backfill );
880+ crimson::osd::set_subsets (subsets, recovery_info);
881+ }
882+
860883RecoveryBackend::interruptible_future<>
861884ReplicatedRecoveryBackend::handle_pull_response (
862885 Ref<MOSDPGPush> m)
0 commit comments