Skip to content

Commit

Permalink
MDEV-26520 Make innodb_purge_threads dynamic
Browse files Browse the repository at this point in the history
preallocate max. count of THDs puge might need at startup.
Doing this at any other point of time is difficult, error prone
  • Loading branch information
vaintroub committed Sep 23, 2021
1 parent 2255649 commit 359c286
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 10 deletions.
25 changes: 22 additions & 3 deletions mysql-test/suite/sys_vars/r/innodb_purge_threads_basic.result
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,27 @@ SELECT COUNT(@@innodb_purge_threads);
COUNT(@@innodb_purge_threads)
1
1 Expected
SET @save_threads = @@GLOBAL.innodb_purge_threads;
SET @@GLOBAL.innodb_purge_threads=-1;
Warnings:
Warning 1292 Truncated incorrect innodb_purge_threads value: '-1'
SELECT @@GLOBAL.innodb_purge_threads;
@@GLOBAL.innodb_purge_threads
1
SET @@GLOBAL.innodb_purge_threads=0;
Warnings:
Warning 1292 Truncated incorrect innodb_purge_threads value: '0'
SELECT @@GLOBAL.innodb_purge_threads;
@@GLOBAL.innodb_purge_threads
1
SET @@GLOBAL.innodb_purge_threads=33;
Warnings:
Warning 1292 Truncated incorrect innodb_purge_threads value: '33'
SELECT @@GLOBAL.innodb_purge_threads;
@@GLOBAL.innodb_purge_threads
32
SET @@GLOBAL.innodb_purge_threads=1;
ERROR HY000: Variable 'innodb_purge_threads' is a read only variable
Expected error 'Read-only variable'
SET @@GLOBAL.innodb_purge_threads=32;
SELECT innodb_purge_threads = @@SESSION.innodb_purge_threads;
ERROR 42S22: Unknown column 'innodb_purge_threads' in 'field list'
Expected error 'Read-only variable'
Expand Down Expand Up @@ -38,4 +56,5 @@ SELECT VARIABLE_NAME, VARIABLE_VALUE
FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
WHERE VARIABLE_NAME = 'innodb_purge_threads';
VARIABLE_NAME VARIABLE_VALUE
INNODB_PURGE_THREADS 4
INNODB_PURGE_THREADS 32
SET GLOBAL innodb_purge_threads = @save_threads;
2 changes: 1 addition & 1 deletion mysql-test/suite/sys_vars/r/sysvars_innodb.result
Original file line number Diff line number Diff line change
Expand Up @@ -1387,7 +1387,7 @@ NUMERIC_MIN_VALUE 1
NUMERIC_MAX_VALUE 32
NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
READ_ONLY YES
READ_ONLY NO
COMMAND_LINE_ARGUMENT OPTIONAL
VARIABLE_NAME INNODB_RANDOM_READ_AHEAD
SESSION_VALUE NULL
Expand Down
14 changes: 12 additions & 2 deletions mysql-test/suite/sys_vars/t/innodb_purge_threads_basic.test
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,17 @@ SELECT COUNT(@@GLOBAL.innodb_purge_threads);
SELECT COUNT(@@innodb_purge_threads);
--echo 1 Expected

--error ER_INCORRECT_GLOBAL_LOCAL_VAR
SET @save_threads = @@GLOBAL.innodb_purge_threads;

SET @@GLOBAL.innodb_purge_threads=-1;
SELECT @@GLOBAL.innodb_purge_threads;
SET @@GLOBAL.innodb_purge_threads=0;
SELECT @@GLOBAL.innodb_purge_threads;
SET @@GLOBAL.innodb_purge_threads=33;
SELECT @@GLOBAL.innodb_purge_threads;

SET @@GLOBAL.innodb_purge_threads=1;
--echo Expected error 'Read-only variable'
SET @@GLOBAL.innodb_purge_threads=32;

--Error ER_BAD_FIELD_ERROR
SELECT innodb_purge_threads = @@SESSION.innodb_purge_threads;
Expand Down Expand Up @@ -51,3 +59,5 @@ FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
WHERE VARIABLE_NAME = 'innodb_purge_threads';
--enable_warnings


SET GLOBAL innodb_purge_threads = @save_threads;
17 changes: 15 additions & 2 deletions storage/innobase/handler/ha_innodb.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18752,10 +18752,23 @@ static MYSQL_SYSVAR_ULONG(purge_batch_size, srv_purge_batch_size,
1, /* Minimum value */
5000, 0); /* Maximum value */

extern void srv_update_purge_thread_count(uint n);

static
void
innodb_purge_threads_update(THD*, struct st_mysql_sys_var*, void*, const void*save )
{
srv_update_purge_thread_count(*static_cast<const uint*>(save));
}

static MYSQL_SYSVAR_UINT(purge_threads, srv_n_purge_threads,
PLUGIN_VAR_OPCMDARG | PLUGIN_VAR_READONLY,
PLUGIN_VAR_OPCMDARG,
"Number of tasks for purging transaction history",
NULL, NULL, 4, 1, innodb_purge_threads_MAX, 0);
NULL, innodb_purge_threads_update,
4, /* Default setting */
1, /* Minimum value */
innodb_purge_threads_MAX, /* Maximum value */
0);

static MYSQL_SYSVAR_UINT(fast_shutdown, srv_fast_shutdown,
PLUGIN_VAR_OPCMDARG,
Expand Down
5 changes: 3 additions & 2 deletions storage/innobase/srv/srv0srv.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1723,7 +1723,8 @@ 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);
ut_ad(n > 0);
ut_ad(n <= innodb_purge_threads_MAX);
srv_n_purge_threads = n;
srv_purge_thread_count_changed = 1;
}
Expand Down Expand Up @@ -1964,7 +1965,7 @@ static void purge_coordinator_callback(void*)

void srv_init_purge_tasks()
{
purge_create_background_thds(srv_n_purge_threads);
purge_create_background_thds(innodb_purge_threads_MAX);
purge_coordinator_timer= srv_thread_pool->create_timer
(purge_coordinator_callback, nullptr);
}
Expand Down

0 comments on commit 359c286

Please sign in to comment.