From: Matan Breizman Date: Thu, 21 Sep 2023 12:10:07 +0000 (+0000) Subject: osd/OSD: introduce reset_purged_snaps_last X-Git-Tag: v16.2.15~158^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=aa305b6a8cd38951c7bb7f440bc3e74f113b6f76;p=ceph.git osd/OSD: introduce reset_purged_snaps_last When the OSD preboots it sends a MMonGetPurgedSnaps message to the monitor (`_get_purged_snaps`). The monitor will reply with all the purged snapshots that their purged_epoch_ is in the range of superblock.purged_snaps_last + 1 up to the last superblock.current_epoch + 1. When the OSD will handle the reply from the mon (`handle_get_purged_snaps_reply`) it will call `record_purged_snaps` to write those purged snapshots in the OSD store as well (PSN_ keys). Once purged_snaps_last is reset, in the following OSD reboot, the snapshots that were marked as purged (purged_snaps_ keys) in the mon's store will be also marked, correspondingly, in the OSD store. That way `scrub_purged_snaps` will be able to re-trim the snapshots that weren't marked as purged in the OSD side (for some reason) Fixes: https://tracker.ceph.com/issues/62981 Signed-off-by: Matan Breizman (cherry picked from commit 120ed0f0e8f65c18bfcd1d649617770c2c5af663) Manual conflict fixes: 'scrubdebug' command was removed since it's not part of the original commit. write_superblock() parameters were changed --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index e0d8d78650a1..92acf41ce2fd 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -3031,6 +3031,19 @@ will start to track new ops received afterwards."; scrub_purged_snaps(); } + else if (prefix == "reset_purged_snaps_last") { + lock_guard l(osd_lock); + superblock.purged_snaps_last = 0; + ObjectStore::Transaction t; + dout(10) << __func__ << " updating superblock" << dendl; + write_superblock(t); + ret = store->queue_transaction(service.meta_ch, std::move(t), nullptr); + if (ret < 0) { + ss << "Error writing superblock: " << cpp_strerror(ret); + goto out; + } + } + else if (prefix == "dump_osd_network") { lock_guard l(osd_lock); int64_t value = 0; @@ -4162,6 +4175,11 @@ void OSD::final_init() asok_hook, "Scrub purged_snaps vs snapmapper index"); ceph_assert(r == 0); + r = admin_socket->register_command( + "reset_purged_snaps_last", + asok_hook, + "Reset the superblock's purged_snaps_last"); + ceph_assert(r == 0); // -- pg commands -- // old form: ceph pg command ...