Correctly delete handle_immediate_ops when stopping a client

Fixes map::at crash in some cases
This commit is contained in:
Vitaliy Filippov
2026-03-02 01:48:19 +03:00
parent fd3e3b4ef0
commit 310c512b43
4 changed files with 9 additions and 3 deletions
+1 -1
View File
@@ -209,7 +209,7 @@ protected:
std::vector<int> read_ready_clients; std::vector<int> read_ready_clients;
std::vector<int> write_ready_clients; std::vector<int> write_ready_clients;
// We don't use ringloop->set_immediate here because we may have no ringloop in client :) // We don't use ringloop->set_immediate here because we may have no ringloop in client :)
std::vector<osd_op_t*> set_immediate_ops; std::deque<osd_op_t*> set_immediate_ops;
public: public:
timerfd_manager_t *tfd = NULL; timerfd_manager_t *tfd = NULL;
+3 -2
View File
@@ -160,8 +160,10 @@ void osd_messenger_t::clear_immediate_ops(int peer_fd)
void osd_messenger_t::handle_immediate_ops() void osd_messenger_t::handle_immediate_ops()
{ {
for (auto op: set_immediate_ops) while (set_immediate_ops.size())
{ {
auto op = set_immediate_ops.front();
set_immediate_ops.pop_front();
if (op->op_type == OSD_OP_IN) if (op->op_type == OSD_OP_IN)
{ {
exec_op(op); exec_op(op);
@@ -172,7 +174,6 @@ void osd_messenger_t::handle_immediate_ops()
std::function<void(osd_op_t*)>(op->callback)(op); std::function<void(osd_op_t*)>(op->callback)(op);
} }
} }
set_immediate_ops.clear();
} }
bool osd_messenger_t::handle_read_buffer(osd_client_t *cl, void *curbuf, int remain) bool osd_messenger_t::handle_read_buffer(osd_client_t *cl, void *curbuf, int remain)
+1
View File
@@ -57,6 +57,7 @@ void osd_messenger_t::stop_client(int peer_fd, bool force, bool force_delete)
{ {
return; return;
} }
clear_immediate_ops(peer_fd);
if (log_level > 0) if (log_level > 0)
{ {
if (cl->osd_num) if (cl->osd_num)
+4
View File
@@ -57,3 +57,7 @@ json11::Json::object osd_messenger_t::merge_configs(const json11::Json::object &
{ {
return cli_config; return cli_config;
} }
void osd_messenger_t::clear_immediate_ops(int peer_fd)
{
}