228 tl::expected<SnapMapper::object_snaps, Scrub::SnapMapReaderI::result_t>
229 SnapMapper::get_snaps_common(const hobject_t &oid) const
230 {
231 ceph_assert(check(oid));
232 set<string> keys{to_object_key(oid)};
233 // dout(20) << fmt::format("{}: key string: {} oid:{}", __func__, keys, oid)
234 // << dendl;
235
236 map<string, ceph::buffer::list> got;
...
264 std::set<std::string> SnapMapper::to_raw_keys(
265 const hobject_t &clone,
266 const std::set<snapid_t> &snaps) const
267 {
268 std::set<std::string> keys;
269 for (auto snap : snaps) {
270 keys.insert(to_raw_key(snap, clone));
271 }
272 // dout(20) << fmt::format(
273 // "{}: clone:{} snaps:{} -> keys: {}", __func__, clone, snaps,
274 // keys)
275 // << dendl;
276 return keys;
277 }
...
305 std::set<snapid_t> snaps_from_mapping;
306 for (auto &[k, v] : kvmap) {
307 dout(20) << __func__ << " " << hoid << " " << k << dendl;
308 // extract the object ID from the value fetched for an SNA mapping key
309 auto [sn, obj] = SnapMapper::from_raw(v);
310 if (obj != hoid) {
311 dout(1) << fmt::format(
312 "{}: unexpected object ID {} for key{} (expected {})",
313 __func__, obj, k, hoid)
314 << dendl;
315 return tl::unexpected(result_t{code_t::inconsistent});
316 }
317 snaps_from_mapping.insert(sn);
318 }
319
320 if (snaps_from_mapping != *obj_snaps) {
321 // dout(10) << fmt::format(
322 // "{}: hoid:{} -> mapper internal inconsistency ({} vs {})",
323 // __func__, hoid, *obj_snaps, snaps_from_mapping)
324 // << dendl;
325 return tl::unexpected(result_t{code_t::inconsistent});
326 }
327 // dout(10) << fmt::format(
328 // "{}: snaps for {}: {}", __func__, hoid, snaps_from_mapping)
329 // << dendl;
330 return obj_snaps;
331 }