]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd/pg: set obc's ssc when handling pull responses
authorXuehan Xu <xuxuehan@qianxin.com>
Tue, 5 Sep 2023 01:26:17 +0000 (09:26 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Tue, 9 Jan 2024 05:40:36 +0000 (13:40 +0800)
Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/crimson/osd/replicated_recovery_backend.cc

index 1ff0623abdc058ca1772251893a457a94eef35de..9a1060c440e2736c0c568f4b052a4b2c57788ffe 100644 (file)
@@ -804,11 +804,21 @@ ReplicatedRecoveryBackend::_handle_pull_response(
         recovery_waiter.obc = obc;
         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);
+        auto ss_attr_iter = push_op.attrset.find(SS_ATTR);
+        if (ss_attr_iter != push_op.attrset.end()) {
+          if (!obc->ssc) {
+            obc->ssc = new crimson::osd::SnapSetContext(
+              push_op.soid.get_snapdir());
+          }
+          try {
+            obc->ssc->snapset = SnapSet(ss_attr_iter->second);
+            obc->ssc->exists = true;
+          } catch (const buffer::error&) {
+            logger().warn("unable to decode SnapSet");
+            throw crimson::osd::invalid_argument();
+          }
           assert(!pull_info.obc->ssc->exists ||
-                 ss.seq == pull_info.obc->ssc->snapset.seq);
+                 obc->ssc->snapset.seq == pull_info.obc->ssc->snapset.seq);
         }
         pull_info.recovery_info.oi = obc->obs.oi;
         if (pull_info.recovery_info.soid.snap &&