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 &&