From: Matan Breizman Date: Thu, 9 Nov 2023 09:39:23 +0000 (+0000) Subject: crimson/osd/osd_operations/snaptrim_event: fix lifetime management X-Git-Tag: v19.0.0~95^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F54431%2Fhead;p=ceph.git crimson/osd/osd_operations/snaptrim_event: fix lifetime management The operation's id and future returned when starting SnapTrimObjSubEvent is emplaced into subop_blocker. Later on, we await the completion of all the started operations futures. Before this patch, we only stored the op id in the subop_blocker vector which allowed `op` to go out of scope and lose all its references (and get deleted) before exiting. Storing the operation as a reference instead of the id will maintain the SnapTrimObjSubEvent operation lifetime. Fixes: https://tracker.ceph.com/issues/63299 Signed-off-by: Matan Breizman --- diff --git a/src/crimson/osd/osd_operations/snaptrim_event.cc b/src/crimson/osd/osd_operations/snaptrim_event.cc index ffd43d736ad3..21fd6e94da94 100644 --- a/src/crimson/osd/osd_operations/snaptrim_event.cc +++ b/src/crimson/osd/osd_operations/snaptrim_event.cc @@ -44,7 +44,7 @@ void SnapTrimEvent::SubOpBlocker::dump_detail(Formatter *f) const f->open_array_section("dependent_operations"); { for (const auto &kv : subops) { - f->dump_unsigned("op_id", kv.first); + f->dump_unsigned("op_id", kv.first->get_id()); } } f->close_section(); @@ -152,7 +152,7 @@ SnapTrimEvent::start() object, snapid); subop_blocker.emplace_back( - op->get_id(), + std::move(op), std::move(fut) ); } diff --git a/src/crimson/osd/osd_operations/snaptrim_event.h b/src/crimson/osd/osd_operations/snaptrim_event.h index afb24952a045..f7c512881de3 100644 --- a/src/crimson/osd/osd_operations/snaptrim_event.h +++ b/src/crimson/osd/osd_operations/snaptrim_event.h @@ -61,7 +61,7 @@ private: struct SubOpBlocker : crimson::BlockerT { static constexpr const char* type_name = "CompoundOpBlocker"; - using id_done_t = std::pair>; void dump_detail(Formatter *f) const final;