From 26dd863c8d745d119cc483037cd274a5b11941a5 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Fri, 16 Feb 2024 00:14:05 +0300 Subject: [PATCH] Fix sometimes possible crash on clients.at() during pings --- src/messenger.cpp | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/messenger.cpp b/src/messenger.cpp index e1cb9db8..d1d7de26 100644 --- a/src/messenger.cpp +++ b/src/messenger.cpp @@ -45,11 +45,12 @@ void osd_messenger_t::init() #endif keepalive_timer_id = tfd->set_timer(1000, true, [this](int) { - std::vector to_stop; - std::vector to_ping; - for (auto cl_it = clients.begin(); cl_it != clients.end(); cl_it++) + auto cl_it = clients.begin(); + while (cl_it != clients.end()) { auto cl = cl_it->second; + cl_it++; + auto peer_fd = cl->peer_fd; if (!cl->osd_num || cl->peer_state != PEER_CONNECTED && cl->peer_state != PEER_RDMA) { // Do not run keepalive on regular clients @@ -62,7 +63,9 @@ void osd_messenger_t::init() { // Ping timed out, stop the client fprintf(stderr, "Ping timed out for OSD %lu (client %d), disconnecting peer\n", cl->osd_num, cl->peer_fd); - to_stop.push_back(cl->peer_fd); + stop_client(peer_fd, true); + // Restart iterator because it may be invalidated + cl_it = clients.upper_bound(peer_fd); } } else if (cl->idle_time_remaining > 0) @@ -100,9 +103,11 @@ void osd_messenger_t::init() stop_client(fail_fd, true); } }; - to_ping.push_back(op); cl->ping_time_remaining = osd_ping_timeout; cl->idle_time_remaining = osd_idle_timeout; + outbox_push(op); + // Restart iterator because it may be invalidated + cl_it = clients.upper_bound(peer_fd); } } else @@ -110,15 +115,6 @@ void osd_messenger_t::init() cl->idle_time_remaining = osd_idle_timeout; } } - // Don't stop clients while a 'clients' iterator is still active - for (int peer_fd: to_stop) - { - stop_client(peer_fd, true); - } - for (auto op: to_ping) - { - outbox_push(op); - } }); }