]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd/replicated_recovery_backend: handle_pull_response() - recalc_subsets()
authorMatan Breizman <mbreizma@redhat.com>
Wed, 4 Jan 2023 12:45:51 +0000 (12:45 +0000)
committerMatan Breizman <mbreizma@redhat.com>
Thu, 4 Jan 2024 15:18:11 +0000 (15:18 +0000)
Signed-off-by: Matan Breizman <mbreizma@redhat.com>
src/crimson/osd/replicated_recovery_backend.cc
src/crimson/osd/replicated_recovery_backend.h

index f78994e8a5af5c48e43cb17616b39d406d9ebfd7..1ff0623abdc058ca1772251893a457a94eef35de 100644 (file)
@@ -799,11 +799,23 @@ ReplicatedRecoveryBackend::_handle_pull_response(
   if (pull_info.recovery_progress.first) {
     prepare_waiter = pg.obc_loader.with_obc<RWState::RWNONE>(
       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<MOSDPGPush> m)
index 8faed2fbf3f298b5e94562b8867d32cac9c3bd4b..cd1d9e067289e3c240d331e70d1cf7d329a528b1 100644 (file)
@@ -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<interval_set<uint64_t>, ceph::bufferlist> trim_pushed_data(
     const interval_set<uint64_t> &copy_subset,
     const interval_set<uint64_t> &intervals_received,