From 876ceab888cb915c54d6e24f21b676144ec00996 Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Mon, 22 Jul 2024 14:03:25 +0800 Subject: [PATCH] crimson/osd/osd_operation/client_request: requeue client requests from a temporary queue other than ClientRequest::Orderer::list This avoids the possible destructions of client requests during the iteration of ClientRequest::Orderer::list Fixes: https://tracker.ceph.com/issues/67068 Signed-off-by: Xuehan Xu --- src/crimson/osd/osd_operations/client_request.cc | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/crimson/osd/osd_operations/client_request.cc b/src/crimson/osd/osd_operations/client_request.cc index 4a721d1277f..dcb1e5e1403 100644 --- a/src/crimson/osd/osd_operations/client_request.cc +++ b/src/crimson/osd/osd_operations/client_request.cc @@ -23,10 +23,18 @@ namespace crimson::osd { void ClientRequest::Orderer::requeue(Ref pg) { LOG_PREFIX(ClientRequest::Orderer::requeue); - for (auto &req: list) { - DEBUGDPP("requeueing {}", *pg, req); - req.reset_instance_handle(); - std::ignore = req.with_pg_process(pg); + std::list to_requeue; + for (auto &req : list) { + to_requeue.emplace_back(&req); + } + // Client requests might be destroyed in the following + // iteration leading to short lived dangling pointers + // to those requests, but this doesn't hurt as we won't + // dereference those dangling pointers. + for (auto req: to_requeue) { + DEBUGDPP("requeueing {}", *pg, *req); + req->reset_instance_handle(); + std::ignore = req->with_pg_process(pg); } } -- 2.39.5