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> write_ready_clients;
// 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:
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()
{
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)
{
exec_op(op);
@@ -172,7 +174,6 @@ void osd_messenger_t::handle_immediate_ops()
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)
+1
View File
@@ -57,6 +57,7 @@ void osd_messenger_t::stop_client(int peer_fd, bool force, bool force_delete)
{
return;
}
clear_immediate_ops(peer_fd);
if (log_level > 0)
{
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;
}
void osd_messenger_t::clear_immediate_ops(int peer_fd)
{
}