summaryrefslogtreecommitdiff
path: root/storage/innobase/buf/buf0buf.cc
diff options
context:
space:
mode:
Diffstat (limited to 'storage/innobase/buf/buf0buf.cc')
-rw-r--r--storage/innobase/buf/buf0buf.cc61
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