From 0159a75ceda0256b14bc3604b69b2deed38ff8bc Mon Sep 17 00:00:00 2001 From: yiguolei <676222867@qq.com> Date: Tue, 12 Mar 2024 18:37:06 +0800 Subject: [PATCH] [bugfix](becore) be will core when stop because the map is modified during iterator (#32105) Co-authored-by: yiguolei --- be/src/vec/runtime/vdata_stream_mgr.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/be/src/vec/runtime/vdata_stream_mgr.cpp b/be/src/vec/runtime/vdata_stream_mgr.cpp index 37cf47f4a3..42e7df4e3c 100644 --- a/be/src/vec/runtime/vdata_stream_mgr.cpp +++ b/be/src/vec/runtime/vdata_stream_mgr.cpp @@ -38,12 +38,17 @@ VDataStreamMgr::VDataStreamMgr() { } VDataStreamMgr::~VDataStreamMgr() { - // TODO: metric + // Has to call close here, because receiver will check if the receiver is closed. + // It will core during graceful stop. + auto receivers = std::vector>(); auto receiver_iterator = _receiver_map.begin(); while (receiver_iterator != _receiver_map.end()) { - // Has to call close here, because receiver will check if the receiver is closed. - // It will core during graceful stop. - receiver_iterator->second->close(); + // Could not call close directly, because during close method, it will remove itself + // from the map, and modify the map, it will core. + receivers.push_back(receiver_iterator->second); + } + for (auto iter = receivers.begin(); iter != receivers.end(); ++iter) { + (*iter)->close(); } }