From 78bd7d86a4a0b3733ba38373213645a6b3a9b9c6 Mon Sep 17 00:00:00 2001 From: Vladislav Vaintroub Date: Thu, 17 Jun 2021 20:39:47 +0200 Subject: MDEV-25953 Tpool - prevent potential deadlock in simulated AIO Do not execute user callback just after pwrite. Instead, submit user function as task into thread pool. This way, the IO thread would not hog aiocb, which is a limited (in Innodb) resource --- tpool/aio_simulated.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'tpool') diff --git a/tpool/aio_simulated.cc b/tpool/aio_simulated.cc index 4811797a75e..93b2ae134b2 100644 --- a/tpool/aio_simulated.cc +++ b/tpool/aio_simulated.cc @@ -159,7 +159,9 @@ public: #endif cb->m_ret_len = ret_len; cb->m_err = err; - cb->m_callback(cb); + cb->m_internal_task.m_func= cb->m_callback; + thread_pool *pool= (thread_pool *)cb->m_internal; + pool->submit_task(&cb->m_internal_task); } virtual int submit_io(aiocb *aiocb) override @@ -167,6 +169,7 @@ public: aiocb->m_internal_task.m_func = simulated_aio_callback; aiocb->m_internal_task.m_arg = aiocb; aiocb->m_internal_task.m_group = aiocb->m_group; + aiocb->m_internal = m_pool; m_pool->submit_task(&aiocb->m_internal_task); return 0; } -- cgit v1.2.1