Commit 1a69e158 authored by Vladislav Vaintroub's avatar Vladislav Vaintroub

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).
parent 4b6ef03d
...@@ -1861,10 +1861,13 @@ static bool srv_task_execute() ...@@ -1861,10 +1861,13 @@ static bool srv_task_execute()
return false; return false;
} }
static void purge_create_background_thds(int );
std::mutex purge_thread_count_mtx; std::mutex purge_thread_count_mtx;
void srv_update_purge_thread_count(uint n) void srv_update_purge_thread_count(uint n)
{ {
std::lock_guard<std::mutex> lk(purge_thread_count_mtx); std::lock_guard<std::mutex> lk(purge_thread_count_mtx);
purge_create_background_thds(n);
srv_n_purge_threads = n; srv_n_purge_threads = n;
srv_purge_thread_count_changed = 1; srv_purge_thread_count_changed = 1;
} }
...@@ -1959,15 +1962,25 @@ static std::list<THD*> purge_thds; ...@@ -1959,15 +1962,25 @@ static std::list<THD*> purge_thds;
static std::mutex purge_thd_mutex; static std::mutex purge_thd_mutex;
extern void* thd_attach_thd(THD*); extern void* thd_attach_thd(THD*);
extern void thd_detach_thd(void *); 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); std::unique_lock<std::mutex> lk(purge_thd_mutex);
if (purge_thds.empty()) { while (n_purge_thds < n)
THD* thd = current_thd; {
purge_thds.push_back(innobase_create_background_thd("InnoDB purge worker")); 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(); THD* thd = purge_thds.front();
purge_thds.pop_front(); purge_thds.pop_front();
lk.unlock(); lk.unlock();
...@@ -2068,6 +2081,7 @@ static void purge_coordinator_callback(void*) ...@@ -2068,6 +2081,7 @@ static void purge_coordinator_callback(void*)
void srv_init_purge_tasks() void srv_init_purge_tasks()
{ {
purge_create_background_thds(srv_n_purge_threads);
purge_coordinator_timer= srv_thread_pool->create_timer purge_coordinator_timer= srv_thread_pool->create_timer
(purge_coordinator_timer_callback, nullptr); (purge_coordinator_timer_callback, nullptr);
} }
...@@ -2078,11 +2092,13 @@ static void srv_shutdown_purge_tasks() ...@@ -2078,11 +2092,13 @@ static void srv_shutdown_purge_tasks()
delete purge_coordinator_timer; delete purge_coordinator_timer;
purge_coordinator_timer= nullptr; purge_coordinator_timer= nullptr;
purge_worker_task.wait(); purge_worker_task.wait();
std::unique_lock<std::mutex> lk(purge_thd_mutex);
while (!purge_thds.empty()) while (!purge_thds.empty())
{ {
innobase_destroy_background_thd(purge_thds.front()); innobase_destroy_background_thd(purge_thds.front());
purge_thds.pop_front(); purge_thds.pop_front();
} }
n_purge_thds= 0;
} }
/**********************************************************************//** /**********************************************************************//**
...@@ -2123,7 +2139,8 @@ ulint srv_get_task_queue_length() ...@@ -2123,7 +2139,8 @@ ulint srv_get_task_queue_length()
void srv_purge_shutdown() void srv_purge_shutdown()
{ {
if (purge_sys.enabled()) { 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()) { while(!srv_purge_should_exit()) {
ut_a(!purge_sys.paused()); ut_a(!purge_sys.paused());
srv_wake_purge_thread_if_not_active(); srv_wake_purge_thread_if_not_active();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment