diff options
author | Vladislav Vaintroub <wlad@mariadb.com> | 2021-08-30 23:41:50 +0200 |
---|---|---|
committer | Vladislav Vaintroub <wlad@mariadb.com> | 2021-08-30 23:56:15 +0200 |
commit | 1a69e1588b47403972a2475216e34dc3ff554eec (patch) | |
tree | 233708b96d574f600d6e17b761b01789d59d048a | |
parent | 4b6ef03dcda608109f0455732ab9ed65f32b06bb (diff) | |
download | mariadb-git-1a69e1588b47403972a2475216e34dc3ff554eec.tar.gz |
MDEV-26511 Only allocate Innodb background purge thd, when it is safe.
Change logic to only allocate purge thds at startup, or
in pre-shutdown (for slow shutdown).
-rw-r--r-- | storage/innobase/srv/srv0srv.cc | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/storage/innobase/srv/srv0srv.cc b/storage/innobase/srv/srv0srv.cc index 9525219a656..2a42d516761 100644 --- a/storage/innobase/srv/srv0srv.cc +++ b/storage/innobase/srv/srv0srv.cc @@ -1861,10 +1861,13 @@ static bool srv_task_execute() return false; } +static void purge_create_background_thds(int ); + std::mutex purge_thread_count_mtx; void srv_update_purge_thread_count(uint n) { std::lock_guard<std::mutex> lk(purge_thread_count_mtx); + purge_create_background_thds(n); srv_n_purge_threads = n; srv_purge_thread_count_changed = 1; } @@ -1959,15 +1962,25 @@ static std::list<THD*> purge_thds; static std::mutex purge_thd_mutex; extern void* thd_attach_thd(THD*); extern void thd_detach_thd(void *); +static int n_purge_thds; -static THD *acquire_thd(void **ctx) +/* Ensure that we have at least n background THDs for purge */ +static void purge_create_background_thds(int n) { + THD *thd= current_thd; std::unique_lock<std::mutex> lk(purge_thd_mutex); - if (purge_thds.empty()) { - THD* thd = current_thd; + while (n_purge_thds < n) + { purge_thds.push_back(innobase_create_background_thd("InnoDB purge worker")); - set_current_thd(thd); + n_purge_thds++; } + set_current_thd(thd); +} + +static THD *acquire_thd(void **ctx) +{ + std::unique_lock<std::mutex> lk(purge_thd_mutex); + ut_a(!purge_thds.empty()); THD* thd = purge_thds.front(); purge_thds.pop_front(); lk.unlock(); @@ -2068,6 +2081,7 @@ static void purge_coordinator_callback(void*) void srv_init_purge_tasks() { + purge_create_background_thds(srv_n_purge_threads); purge_coordinator_timer= srv_thread_pool->create_timer (purge_coordinator_timer_callback, nullptr); } @@ -2078,11 +2092,13 @@ static void srv_shutdown_purge_tasks() delete purge_coordinator_timer; purge_coordinator_timer= nullptr; purge_worker_task.wait(); + std::unique_lock<std::mutex> lk(purge_thd_mutex); while (!purge_thds.empty()) { innobase_destroy_background_thd(purge_thds.front()); purge_thds.pop_front(); } + n_purge_thds= 0; } /**********************************************************************//** @@ -2123,7 +2139,8 @@ ulint srv_get_task_queue_length() void srv_purge_shutdown() { if (purge_sys.enabled()) { - srv_update_purge_thread_count(innodb_purge_threads_MAX); + if (!srv_fast_shutdown) + srv_update_purge_thread_count(innodb_purge_threads_MAX); while(!srv_purge_should_exit()) { ut_a(!purge_sys.paused()); srv_wake_purge_thread_if_not_active(); |