1
0
mirror of https://github.com/MariaDB/server.git synced 2026-10-23 18:49:29 +03:00

MDEV-37728: Fix shutdown deadlock between thr_timer_end and set_period

The mysys timer (thr_timer) could deadlock with
srv_thread_pool_end() due to lock inversion:

- LOCK_timer is held during the entire timer action routine.
- timer action executed in mysys thread may lock timer_generic::m_mtx.
- main thread  holding the same timer_generic::m_mtx calls
  thr_timer_end(), which also needs LOCK_timer.

This inversion can cause a very rare shutdown deadlock, when the
threadpool extends the maintenance() period after idling for a
minute and shutdown occurs simultaneously.

Workaround: Use try_lock in timer_generic::set_period() to avoid blocking,
to break the deadlock cycle, and ignore errors.

Root cause is the thr_timer holds the global LOCK_timer for the
entire duration of every timer action. This makes it difficult or
impossible to use additional locks safely inside timer routines.
Fortunately, in this case a failed try_lock has no impact.
This commit is contained in:
Vladislav Vaintroub
2025-09-24 21:31:34 +02:00
parent 990b44495c
commit 21395bbb6c

View File

@@ -393,7 +393,9 @@ public:
*/
void set_period(int period_ms)
{
std::unique_lock<std::mutex> lk(m_mtx);
std::unique_lock<std::mutex> lk(m_mtx, std::defer_lock);
if (!lk.try_lock())
return;
if (!m_on)
return;
if (!m_pool)