diff options
Diffstat (limited to 'storage/innobase/buf/buf0buf.cc')
-rw-r--r-- | storage/innobase/buf/buf0buf.cc | 61 |
1 files changed, 26 insertions, 35 deletions
diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc index 41d242a9360..89f75b8de55 100644 --- a/storage/innobase/buf/buf0buf.cc +++ b/storage/innobase/buf/buf0buf.cc @@ -2021,7 +2021,7 @@ buf_pool_init_instance( /* Initialize the temporal memory array and slots */ new(&buf_pool->io_buf) buf_pool_t::io_buf_t( (srv_n_read_io_threads + srv_n_write_io_threads) - * (8 * OS_AIO_N_PENDING_IOS_PER_THREAD)); + * OS_AIO_N_PENDING_IOS_PER_THREAD); buf_pool_mutex_exit(buf_pool); @@ -3186,48 +3186,39 @@ calc_buf_pool_size: return; } -/** This is the thread for resizing buffer pool. It waits for an event and -when waked up either performs a resizing and sleeps again. -@return this function does not return, calls os_thread_exit() -*/ -extern "C" -os_thread_ret_t -DECLARE_THREAD(buf_resize_thread)(void*) +/* Thread pool task invoked by innodb_buffer_pool_size changes. */ +static void buf_resize_callback(void *) { - my_thread_init(); - - while (srv_shutdown_state == SRV_SHUTDOWN_NONE) { - os_event_wait(srv_buf_resize_event); - os_event_reset(srv_buf_resize_event); - - if (srv_shutdown_state != SRV_SHUTDOWN_NONE) { - break; - } - - buf_pool_mutex_enter_all(); - if (srv_buf_pool_old_size == srv_buf_pool_size) { - buf_pool_mutex_exit_all(); - std::ostringstream sout; - sout << "Size did not change (old size = new size = " - << srv_buf_pool_size << ". Nothing to do."; - buf_resize_status(sout.str().c_str()); - - /* nothing to do */ - continue; - } + ut_a(srv_shutdown_state == SRV_SHUTDOWN_NONE); + buf_pool_mutex_enter_all(); + if (srv_buf_pool_old_size == srv_buf_pool_size) { buf_pool_mutex_exit_all(); - - buf_pool_resize(); + std::ostringstream sout; + sout << "Size did not change (old size = new size = " + << srv_buf_pool_size << ". Nothing to do."; + buf_resize_status(sout.str().c_str()); + return; } + buf_pool_mutex_exit_all(); + buf_pool_resize(); +} - srv_buf_resize_thread_active = false; +/* Ensure that task does not run in parallel, by setting max_concurrency to 1 for the thread group */ +static tpool::task_group single_threaded_group(1); +static tpool::waitable_task buf_resize_task(buf_resize_callback, + nullptr, &single_threaded_group); - my_thread_end(); - os_thread_exit(); +void buf_resize_start() +{ + srv_thread_pool->submit_task(&buf_resize_task); +} - OS_THREAD_DUMMY_RETURN; +void buf_resize_shutdown() +{ + buf_resize_task.wait(); } + #ifdef BTR_CUR_HASH_ADAPT /** Clear the adaptive hash index on all pages in the buffer pool. */ void |