From 494ec06f30199f9b86e4f3dd93cba223a986abf0 Mon Sep 17 00:00:00 2001 From: Matan Breizman Date: Tue, 20 Aug 2024 12:34:56 +0000 Subject: [PATCH] osd/SnapMapper: introduce SnapMapper::update_snap_map Moved from PG::update_snap_map to be used by Crimson as well Signed-off-by: Matan Breizman --- src/osd/SnapMapper.cc | 44 +++++++++++++++++++++++++++++++++++++++++++ src/osd/SnapMapper.h | 4 ++++ 2 files changed, 48 insertions(+) diff --git a/src/osd/SnapMapper.cc b/src/osd/SnapMapper.cc index 414de479dc70c..4ece888041126 100644 --- a/src/osd/SnapMapper.cc +++ b/src/osd/SnapMapper.cc @@ -728,6 +728,50 @@ int SnapMapper::get_snaps( return 0; } +void SnapMapper::update_snap_map( + const pg_log_entry_t& i, + MapCacher::Transaction *_t) +{ + ceph_assert(i.soid.snap < CEPH_MAXSNAP); + dout(20) << __func__ << " " << i << dendl; + if (i.is_delete()) { + int r = remove_oid( + i.soid, + _t); + if (r) + dout(20) << __func__ << " remove_oid " << i.soid << " failed with " << r << dendl; + // On removal tolerate missing key corruption + ceph_assert(r == 0 || r == -ENOENT); + } else if (i.is_update()) { + ceph_assert(i.snaps.length() > 0); + std::vector snaps; + bufferlist snapbl = i.snaps; + auto p = snapbl.cbegin(); + try { + decode(snaps, p); + } catch (...) { + dout(20) << __func__ << " decode snaps failure on " << i << dendl; + snaps.clear(); + } + std::set _snaps(snaps.begin(), snaps.end()); + + if (i.is_clone() || i.is_promote()) { + add_oid( + i.soid, + _snaps, + _t); + } else if (i.is_modify()) { + int r = update_snaps( + i.soid, + _snaps, + 0, + _t); + ceph_assert(r == 0); + } else { + ceph_assert(i.is_clean()); + } + } +} // -- purged snaps -- diff --git a/src/osd/SnapMapper.h b/src/osd/SnapMapper.h index f9a371932f622..a43bb5d94f054 100644 --- a/src/osd/SnapMapper.h +++ b/src/osd/SnapMapper.h @@ -394,6 +394,10 @@ private: std::set *snaps ///< [out] snaps ) const; ///< @return error, -ENOENT if oid is not recorded + void update_snap_map( + const pg_log_entry_t& i, + MapCacher::Transaction *t); + /// Get snaps for oid - alternative interface tl::expected, SnapMapReaderI::result_t> get_snaps( const hobject_t &hoid) const final; -- 2.39.5