Commit 626f2a1c authored by Marko Mäkelä's avatar Marko Mäkelä

MDEV-19614 SET GLOBAL innodb_ deadlock due to LOCK_global_system_variables

The update callback functions for several settable global InnoDB variables
are acquiring InnoDB latches while holding LOCK_global_system_variables.

On the other hand, some InnoDB code is invoking THDVAR() while holding
InnoDB latches. An example of this is thd_lock_wait_timeout() that is
called by lock_rec_enqueue_waiting(). In some cases, the
intern_sys_var_ptr() that is invoked by THDVAR() may acquire
LOCK_global_system_variables, via sync_dynamic_session_variables().

In lock_rec_enqueue_waiting(), we really must be holding some InnoDB
latch while invoking THDVAR(). This implies that
LOCK_global_system_variables must conceptually reside below any InnoDB
latch in the latching order. That in turns implies that the various
update callback functions must release LOCK_global_system_variables
before acquiring any InnoDB mutexes or rw-locks, and reacquire
LOCK_global_system_variables later. The validate functions are being
invoked while not holding LOCK_global_system_variables and thus they
do not need any changes.

The following statements are affected by this:

SET GLOBAL innodb_adaptive_hash_index = …;
SET GLOBAL innodb_cmp_per_index_enabled = 1;
SET GLOBAL innodb_old_blocks_pct = …;
SET GLOBAL innodb_fil_make_page_dirty_debug = …; -- debug builds only
SET GLOBAL innodb_buffer_pool_evict = uncompressed; -- debug builds only
SET GLOBAL innodb_purge_run_now = 1; -- debug builds only
SET GLOBAL innodb_purge_stop_now = 1; -- debug builds only
SET GLOBAL innodb_log_checkpoint_now = 1; -- debug builds only
SET GLOBAL innodb_buf_flush_list_now = 1; -- debug builds only
SET GLOBAL innodb_buffer_pool_dump_now = 1;
SET GLOBAL innodb_buffer_pool_load_now = 1;
SET GLOBAL innodb_buffer_pool_load_abort = 1;
SET GLOBAL innodb_status_output = …;
SET GLOBAL innodb_status_output_locks = …;
SET GLOBAL innodb_encryption_threads = …;
SET GLOBAL innodb_encryption_rotate_key_age = …;
SET GLOBAL innodb_encryption_rotation_iops = …;
SET GLOBAL innodb_encrypt_tables = …;
SET GLOBAL innodb_disallow_writes = …;

buf_LRU_old_ratio_update(): Correct the return type.
parent 242a28c3
/***************************************************************************** /*****************************************************************************
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, 2018, MariaDB Corporation. Copyright (c) 2017, 2019, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -2243,8 +2243,8 @@ buf_LRU_old_ratio_update_instance( ...@@ -2243,8 +2243,8 @@ buf_LRU_old_ratio_update_instance(
buf_pool_t* buf_pool,/*!< in: buffer pool instance */ buf_pool_t* buf_pool,/*!< in: buffer pool instance */
uint old_pct,/*!< in: Reserve this percentage of uint old_pct,/*!< in: Reserve this percentage of
the buffer pool for "old" blocks. */ the buffer pool for "old" blocks. */
ibool adjust) /*!< in: TRUE=adjust the LRU list; bool adjust) /*!< in: true=adjust the LRU list;
FALSE=just assign buf_pool->LRU_old_ratio false=just assign buf_pool->LRU_old_ratio
during the initialization of InnoDB */ during the initialization of InnoDB */
{ {
uint ratio; uint ratio;
...@@ -2282,17 +2282,17 @@ buf_LRU_old_ratio_update_instance( ...@@ -2282,17 +2282,17 @@ buf_LRU_old_ratio_update_instance(
Updates buf_pool->LRU_old_ratio. Updates buf_pool->LRU_old_ratio.
@return updated old_pct */ @return updated old_pct */
UNIV_INTERN UNIV_INTERN
ulint uint
buf_LRU_old_ratio_update( buf_LRU_old_ratio_update(
/*=====================*/ /*=====================*/
uint old_pct,/*!< in: Reserve this percentage of uint old_pct,/*!< in: Reserve this percentage of
the buffer pool for "old" blocks. */ the buffer pool for "old" blocks. */
ibool adjust) /*!< in: TRUE=adjust the LRU list; bool adjust) /*!< in: true=adjust the LRU list;
FALSE=just assign buf_pool->LRU_old_ratio false=just assign buf_pool->LRU_old_ratio
during the initialization of InnoDB */ during the initialization of InnoDB */
{ {
ulint i; ulint i;
ulint new_ratio = 0; uint new_ratio = 0;
for (i = 0; i < srv_buf_pool_instances; i++) { for (i = 0; i < srv_buf_pool_instances; i++) {
buf_pool_t* buf_pool; buf_pool_t* buf_pool;
......
...@@ -17166,11 +17166,13 @@ innodb_adaptive_hash_index_update( ...@@ -17166,11 +17166,13 @@ innodb_adaptive_hash_index_update(
const void* save) /*!< in: immediate result const void* save) /*!< in: immediate result
from check function */ from check function */
{ {
mysql_mutex_unlock(&LOCK_global_system_variables);
if (*(my_bool*) save) { if (*(my_bool*) save) {
btr_search_enable(); btr_search_enable();
} else { } else {
btr_search_disable(); btr_search_disable();
} }
mysql_mutex_lock(&LOCK_global_system_variables);
} }
/****************************************************************//** /****************************************************************//**
...@@ -17191,7 +17193,9 @@ innodb_cmp_per_index_update( ...@@ -17191,7 +17193,9 @@ innodb_cmp_per_index_update(
/* Reset the stats whenever we enable the table /* Reset the stats whenever we enable the table
INFORMATION_SCHEMA.innodb_cmp_per_index. */ INFORMATION_SCHEMA.innodb_cmp_per_index. */
if (!srv_cmp_per_index_enabled && *(my_bool*) save) { if (!srv_cmp_per_index_enabled && *(my_bool*) save) {
mysql_mutex_unlock(&LOCK_global_system_variables);
page_zip_reset_stat_per_index(); page_zip_reset_stat_per_index();
mysql_mutex_lock(&LOCK_global_system_variables);
} }
srv_cmp_per_index_enabled = !!(*(my_bool*) save); srv_cmp_per_index_enabled = !!(*(my_bool*) save);
...@@ -17212,9 +17216,11 @@ innodb_old_blocks_pct_update( ...@@ -17212,9 +17216,11 @@ innodb_old_blocks_pct_update(
const void* save) /*!< in: immediate result const void* save) /*!< in: immediate result
from check function */ from check function */
{ {
innobase_old_blocks_pct = static_cast<uint>( mysql_mutex_unlock(&LOCK_global_system_variables);
buf_LRU_old_ratio_update( uint ratio = buf_LRU_old_ratio_update(*static_cast<const uint*>(save),
*static_cast<const uint*>(save), TRUE)); true);
mysql_mutex_lock(&LOCK_global_system_variables);
innobase_old_blocks_pct = ratio;
} }
/****************************************************************//** /****************************************************************//**
...@@ -17232,9 +17238,10 @@ innodb_change_buffer_max_size_update( ...@@ -17232,9 +17238,10 @@ innodb_change_buffer_max_size_update(
const void* save) /*!< in: immediate result const void* save) /*!< in: immediate result
from check function */ from check function */
{ {
innobase_change_buffer_max_size = innobase_change_buffer_max_size = *static_cast<const uint*>(save);
(*static_cast<const uint*>(save)); mysql_mutex_unlock(&LOCK_global_system_variables);
ibuf_max_size_update(innobase_change_buffer_max_size); ibuf_max_size_update(innobase_change_buffer_max_size);
mysql_mutex_lock(&LOCK_global_system_variables);
} }
#ifdef UNIV_DEBUG #ifdef UNIV_DEBUG
...@@ -17278,6 +17285,7 @@ innodb_make_page_dirty( ...@@ -17278,6 +17285,7 @@ innodb_make_page_dirty(
{ {
mtr_t mtr; mtr_t mtr;
ulong space_id = *static_cast<const ulong*>(save); ulong space_id = *static_cast<const ulong*>(save);
mysql_mutex_unlock(&LOCK_global_system_variables);
mtr_start(&mtr); mtr_start(&mtr);
...@@ -17295,6 +17303,7 @@ innodb_make_page_dirty( ...@@ -17295,6 +17303,7 @@ innodb_make_page_dirty(
MLOG_2BYTES, &mtr); MLOG_2BYTES, &mtr);
} }
mtr_commit(&mtr); mtr_commit(&mtr);
mysql_mutex_lock(&LOCK_global_system_variables);
} }
#endif // UNIV_DEBUG #endif // UNIV_DEBUG
...@@ -17933,8 +17942,11 @@ innodb_buffer_pool_evict_update( ...@@ -17933,8 +17942,11 @@ innodb_buffer_pool_evict_update(
{ {
if (const char* op = *static_cast<const char*const*>(save)) { if (const char* op = *static_cast<const char*const*>(save)) {
if (!strcmp(op, "uncompressed")) { if (!strcmp(op, "uncompressed")) {
mysql_mutex_unlock(&LOCK_global_system_variables);
for (uint tries = 0; tries < 10000; tries++) { for (uint tries = 0; tries < 10000; tries++) {
if (innodb_buffer_pool_evict_uncompressed()) { if (innodb_buffer_pool_evict_uncompressed()) {
mysql_mutex_lock(
&LOCK_global_system_variables);
return; return;
} }
...@@ -18237,7 +18249,9 @@ purge_run_now_set( ...@@ -18237,7 +18249,9 @@ purge_run_now_set(
check function */ check function */
{ {
if (*(my_bool*) save && trx_purge_state() != PURGE_STATE_DISABLED) { if (*(my_bool*) save && trx_purge_state() != PURGE_STATE_DISABLED) {
mysql_mutex_unlock(&LOCK_global_system_variables);
trx_purge_run(); trx_purge_run();
mysql_mutex_lock(&LOCK_global_system_variables);
} }
} }
...@@ -18260,7 +18274,9 @@ purge_stop_now_set( ...@@ -18260,7 +18274,9 @@ purge_stop_now_set(
check function */ check function */
{ {
if (*(my_bool*) save && trx_purge_state() != PURGE_STATE_DISABLED) { if (*(my_bool*) save && trx_purge_state() != PURGE_STATE_DISABLED) {
mysql_mutex_unlock(&LOCK_global_system_variables);
trx_purge_stop(); trx_purge_stop();
mysql_mutex_lock(&LOCK_global_system_variables);
} }
} }
...@@ -18282,6 +18298,8 @@ checkpoint_now_set( ...@@ -18282,6 +18298,8 @@ checkpoint_now_set(
check function */ check function */
{ {
if (*(my_bool*) save) { if (*(my_bool*) save) {
mysql_mutex_unlock(&LOCK_global_system_variables);
while (log_sys->last_checkpoint_lsn < log_sys->lsn) { while (log_sys->last_checkpoint_lsn < log_sys->lsn) {
log_make_checkpoint_at(LSN_MAX, TRUE); log_make_checkpoint_at(LSN_MAX, TRUE);
fil_flush_file_spaces(FIL_LOG); fil_flush_file_spaces(FIL_LOG);
...@@ -18295,6 +18313,8 @@ checkpoint_now_set( ...@@ -18295,6 +18313,8 @@ checkpoint_now_set(
"system tablespace at checkpoint err=%s", "system tablespace at checkpoint err=%s",
ut_strerr(err)); ut_strerr(err));
} }
mysql_mutex_lock(&LOCK_global_system_variables);
} }
} }
...@@ -18316,8 +18336,10 @@ buf_flush_list_now_set( ...@@ -18316,8 +18336,10 @@ buf_flush_list_now_set(
check function */ check function */
{ {
if (*(my_bool*) save) { if (*(my_bool*) save) {
mysql_mutex_unlock(&LOCK_global_system_variables);
buf_flush_list(ULINT_MAX, LSN_MAX, NULL); buf_flush_list(ULINT_MAX, LSN_MAX, NULL);
buf_flush_wait_batch_end(NULL, BUF_FLUSH_LIST); buf_flush_wait_batch_end(NULL, BUF_FLUSH_LIST);
mysql_mutex_lock(&LOCK_global_system_variables);
} }
} }
#endif /* UNIV_DEBUG */ #endif /* UNIV_DEBUG */
...@@ -18419,7 +18441,9 @@ buffer_pool_dump_now( ...@@ -18419,7 +18441,9 @@ buffer_pool_dump_now(
check function */ check function */
{ {
if (*(my_bool*) save && !srv_read_only_mode) { if (*(my_bool*) save && !srv_read_only_mode) {
mysql_mutex_unlock(&LOCK_global_system_variables);
buf_dump_start(); buf_dump_start();
mysql_mutex_lock(&LOCK_global_system_variables);
} }
} }
...@@ -18442,7 +18466,9 @@ buffer_pool_load_now( ...@@ -18442,7 +18466,9 @@ buffer_pool_load_now(
check function */ check function */
{ {
if (*(my_bool*) save && !srv_read_only_mode) { if (*(my_bool*) save && !srv_read_only_mode) {
mysql_mutex_unlock(&LOCK_global_system_variables);
buf_load_start(); buf_load_start();
mysql_mutex_lock(&LOCK_global_system_variables);
} }
} }
...@@ -18465,96 +18491,71 @@ buffer_pool_load_abort( ...@@ -18465,96 +18491,71 @@ buffer_pool_load_abort(
check function */ check function */
{ {
if (*(my_bool*) save && !srv_read_only_mode) { if (*(my_bool*) save && !srv_read_only_mode) {
mysql_mutex_unlock(&LOCK_global_system_variables);
buf_load_abort(); buf_load_abort();
mysql_mutex_lock(&LOCK_global_system_variables);
} }
} }
/** Update innodb_status_output or innodb_status_output_locks, /** Update innodb_status_output or innodb_status_output_locks,
which control InnoDB "status monitor" output to the error log. which control InnoDB "status monitor" output to the error log.
@param[in] thd thread handle @param[out] var current value
@param[in] var system variable
@param[out] var_ptr current value
@param[in] save to-be-assigned value */ @param[in] save to-be-assigned value */
static static
void void
innodb_status_output_update( innodb_status_output_update(THD*,st_mysql_sys_var*,void*var,const void*save)
/*========================*/
THD* thd __attribute__((unused)),
struct st_mysql_sys_var* var __attribute__((unused)),
void* var_ptr __attribute__((unused)),
const void* save __attribute__((unused)))
{ {
*static_cast<my_bool*>(var_ptr) = *static_cast<const my_bool*>(save); *static_cast<my_bool*>(var) = *static_cast<const my_bool*>(save);
mysql_mutex_unlock(&LOCK_global_system_variables);
/* Wakeup server monitor thread. */ /* Wakeup server monitor thread. */
os_event_set(srv_monitor_event); os_event_set(srv_monitor_event);
mysql_mutex_lock(&LOCK_global_system_variables);
} }
/****************************************************************** /** Update the system variable innodb_encryption_threads.
Update the system variable innodb_encryption_threads */ @param[in] save to-be-assigned value */
static static
void void
innodb_encryption_threads_update( innodb_encryption_threads_update(THD*,st_mysql_sys_var*,void*,const void*save)
/*=============================*/
THD* thd, /*!< in: thread handle */
struct st_mysql_sys_var* var, /*!< in: pointer to
system variable */
void* var_ptr,/*!< out: where the
formal string goes */
const void* save) /*!< in: immediate result
from check function */
{ {
mysql_mutex_unlock(&LOCK_global_system_variables);
fil_crypt_set_thread_cnt(*static_cast<const uint*>(save)); fil_crypt_set_thread_cnt(*static_cast<const uint*>(save));
mysql_mutex_lock(&LOCK_global_system_variables);
} }
/****************************************************************** /** Update the system variable innodb_encryption_rotate_key_age.
Update the system variable innodb_encryption_rotate_key_age */ @param[in] save to-be-assigned value */
static static
void void
innodb_encryption_rotate_key_age_update( innodb_encryption_rotate_key_age_update(THD*,st_mysql_sys_var*,void*,
/*====================================*/ const void*save)
THD* thd, /*!< in: thread handle */
struct st_mysql_sys_var* var, /*!< in: pointer to
system variable */
void* var_ptr,/*!< out: where the
formal string goes */
const void* save) /*!< in: immediate result
from check function */
{ {
mysql_mutex_unlock(&LOCK_global_system_variables);
fil_crypt_set_rotate_key_age(*static_cast<const uint*>(save)); fil_crypt_set_rotate_key_age(*static_cast<const uint*>(save));
mysql_mutex_lock(&LOCK_global_system_variables);
} }
/****************************************************************** /** Update the system variable innodb_encryption_rotation_iops.
Update the system variable innodb_encryption_rotation_iops */ @param[in] save to-be-assigned value */
static static
void void
innodb_encryption_rotation_iops_update( innodb_encryption_rotation_iops_update(THD*,st_mysql_sys_var*,void*,
/*===================================*/ const void*save)
THD* thd, /*!< in: thread handle */
struct st_mysql_sys_var* var, /*!< in: pointer to
system variable */
void* var_ptr,/*!< out: where the
formal string goes */
const void* save) /*!< in: immediate result
from check function */
{ {
mysql_mutex_unlock(&LOCK_global_system_variables);
fil_crypt_set_rotation_iops(*static_cast<const uint*>(save)); fil_crypt_set_rotation_iops(*static_cast<const uint*>(save));
mysql_mutex_lock(&LOCK_global_system_variables);
} }
/****************************************************************** /** Update the system variable innodb_encrypt_tables.
Update the system variable innodb_encrypt_tables*/ @param[in] save to-be-assigned value */
static static
void void
innodb_encrypt_tables_update( innodb_encrypt_tables_update(THD*,st_mysql_sys_var*,void*,const void*save)
/*=========================*/
THD* thd, /*!< in: thread handle */
struct st_mysql_sys_var* var, /*!< in: pointer to
system variable */
void* var_ptr,/*!< out: where the
formal string goes */
const void* save) /*!< in: immediate result
from check function */
{ {
mysql_mutex_unlock(&LOCK_global_system_variables);
fil_crypt_set_encrypt_tables(*static_cast<const ulong*>(save)); fil_crypt_set_encrypt_tables(*static_cast<const ulong*>(save));
mysql_mutex_lock(&LOCK_global_system_variables);
} }
static SHOW_VAR innodb_status_variables_export[]= { static SHOW_VAR innodb_status_variables_export[]= {
...@@ -19736,12 +19737,15 @@ innobase_disallow_writes_update( ...@@ -19736,12 +19737,15 @@ innobase_disallow_writes_update(
variable */ variable */
const void* save) /* in: temporary storage */ const void* save) /* in: temporary storage */
{ {
*(my_bool*)var_ptr = *(my_bool*)save; const my_bool val = *static_cast<const my_bool*>(save);
*static_cast<my_bool*>(var_ptr) = val;
ut_a(srv_allow_writes_event); ut_a(srv_allow_writes_event);
if (*(my_bool*)var_ptr) mysql_mutex_unlock(&LOCK_global_system_variables);
if (val)
os_event_reset(srv_allow_writes_event); os_event_reset(srv_allow_writes_event);
else else
os_event_set(srv_allow_writes_event); os_event_set(srv_allow_writes_event);
mysql_mutex_lock(&LOCK_global_system_variables);
} }
static MYSQL_SYSVAR_BOOL(disallow_writes, innobase_disallow_writes, static MYSQL_SYSVAR_BOOL(disallow_writes, innobase_disallow_writes,
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, 2018, MariaDB Corporation. Copyright (c) 2017, 2019, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -202,13 +202,13 @@ buf_LRU_make_block_old( ...@@ -202,13 +202,13 @@ buf_LRU_make_block_old(
Updates buf_pool->LRU_old_ratio. Updates buf_pool->LRU_old_ratio.
@return updated old_pct */ @return updated old_pct */
UNIV_INTERN UNIV_INTERN
ulint uint
buf_LRU_old_ratio_update( buf_LRU_old_ratio_update(
/*=====================*/ /*=====================*/
uint old_pct,/*!< in: Reserve this percentage of uint old_pct,/*!< in: Reserve this percentage of
the buffer pool for "old" blocks. */ the buffer pool for "old" blocks. */
ibool adjust);/*!< in: TRUE=adjust the LRU list; bool adjust);/*!< in: true=adjust the LRU list;
FALSE=just assign buf_pool->LRU_old_ratio false=just assign buf_pool->LRU_old_ratio
during the initialization of InnoDB */ during the initialization of InnoDB */
/********************************************************************//** /********************************************************************//**
Update the historical stats that we are collecting for LRU eviction Update the historical stats that we are collecting for LRU eviction
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, 2018, MariaDB Corporation. Copyright (c) 2017, 2019, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -2408,8 +2408,8 @@ buf_LRU_old_ratio_update_instance( ...@@ -2408,8 +2408,8 @@ buf_LRU_old_ratio_update_instance(
buf_pool_t* buf_pool,/*!< in: buffer pool instance */ buf_pool_t* buf_pool,/*!< in: buffer pool instance */
uint old_pct,/*!< in: Reserve this percentage of uint old_pct,/*!< in: Reserve this percentage of
the buffer pool for "old" blocks. */ the buffer pool for "old" blocks. */
ibool adjust) /*!< in: TRUE=adjust the LRU list; bool adjust) /*!< in: true=adjust the LRU list;
FALSE=just assign buf_pool->LRU_old_ratio false=just assign buf_pool->LRU_old_ratio
during the initialization of InnoDB */ during the initialization of InnoDB */
{ {
uint ratio; uint ratio;
...@@ -2447,17 +2447,17 @@ buf_LRU_old_ratio_update_instance( ...@@ -2447,17 +2447,17 @@ buf_LRU_old_ratio_update_instance(
Updates buf_pool->LRU_old_ratio. Updates buf_pool->LRU_old_ratio.
@return updated old_pct */ @return updated old_pct */
UNIV_INTERN UNIV_INTERN
ulint uint
buf_LRU_old_ratio_update( buf_LRU_old_ratio_update(
/*=====================*/ /*=====================*/
uint old_pct,/*!< in: Reserve this percentage of uint old_pct,/*!< in: Reserve this percentage of
the buffer pool for "old" blocks. */ the buffer pool for "old" blocks. */
ibool adjust) /*!< in: TRUE=adjust the LRU list; bool adjust) /*!< in: true=adjust the LRU list;
FALSE=just assign buf_pool->LRU_old_ratio false=just assign buf_pool->LRU_old_ratio
during the initialization of InnoDB */ during the initialization of InnoDB */
{ {
ulint i; ulint i;
ulint new_ratio = 0; uint new_ratio = 0;
for (i = 0; i < srv_buf_pool_instances; i++) { for (i = 0; i < srv_buf_pool_instances; i++) {
buf_pool_t* buf_pool; buf_pool_t* buf_pool;
......
...@@ -17887,11 +17887,13 @@ innodb_adaptive_hash_index_update( ...@@ -17887,11 +17887,13 @@ innodb_adaptive_hash_index_update(
const void* save) /*!< in: immediate result const void* save) /*!< in: immediate result
from check function */ from check function */
{ {
mysql_mutex_unlock(&LOCK_global_system_variables);
if (*(my_bool*) save) { if (*(my_bool*) save) {
btr_search_enable(); btr_search_enable();
} else { } else {
btr_search_disable(); btr_search_disable();
} }
mysql_mutex_lock(&LOCK_global_system_variables);
} }
/****************************************************************//** /****************************************************************//**
...@@ -17912,7 +17914,9 @@ innodb_cmp_per_index_update( ...@@ -17912,7 +17914,9 @@ innodb_cmp_per_index_update(
/* Reset the stats whenever we enable the table /* Reset the stats whenever we enable the table
INFORMATION_SCHEMA.innodb_cmp_per_index. */ INFORMATION_SCHEMA.innodb_cmp_per_index. */
if (!srv_cmp_per_index_enabled && *(my_bool*) save) { if (!srv_cmp_per_index_enabled && *(my_bool*) save) {
mysql_mutex_unlock(&LOCK_global_system_variables);
page_zip_reset_stat_per_index(); page_zip_reset_stat_per_index();
mysql_mutex_lock(&LOCK_global_system_variables);
} }
srv_cmp_per_index_enabled = !!(*(my_bool*) save); srv_cmp_per_index_enabled = !!(*(my_bool*) save);
...@@ -17933,9 +17937,11 @@ innodb_old_blocks_pct_update( ...@@ -17933,9 +17937,11 @@ innodb_old_blocks_pct_update(
const void* save) /*!< in: immediate result const void* save) /*!< in: immediate result
from check function */ from check function */
{ {
innobase_old_blocks_pct = static_cast<uint>( mysql_mutex_unlock(&LOCK_global_system_variables);
buf_LRU_old_ratio_update( uint ratio = buf_LRU_old_ratio_update(*static_cast<const uint*>(save),
*static_cast<const uint*>(save), TRUE)); true);
mysql_mutex_lock(&LOCK_global_system_variables);
innobase_old_blocks_pct = ratio;
} }
/****************************************************************//** /****************************************************************//**
...@@ -17953,9 +17959,10 @@ innodb_change_buffer_max_size_update( ...@@ -17953,9 +17959,10 @@ innodb_change_buffer_max_size_update(
const void* save) /*!< in: immediate result const void* save) /*!< in: immediate result
from check function */ from check function */
{ {
innobase_change_buffer_max_size = innobase_change_buffer_max_size = *static_cast<const uint*>(save);
(*static_cast<const uint*>(save)); mysql_mutex_unlock(&LOCK_global_system_variables);
ibuf_max_size_update(innobase_change_buffer_max_size); ibuf_max_size_update(innobase_change_buffer_max_size);
mysql_mutex_lock(&LOCK_global_system_variables);
} }
#ifdef UNIV_DEBUG #ifdef UNIV_DEBUG
...@@ -17999,6 +18006,7 @@ innodb_make_page_dirty( ...@@ -17999,6 +18006,7 @@ innodb_make_page_dirty(
{ {
mtr_t mtr; mtr_t mtr;
ulong space_id = *static_cast<const ulong*>(save); ulong space_id = *static_cast<const ulong*>(save);
mysql_mutex_unlock(&LOCK_global_system_variables);
mtr_start(&mtr); mtr_start(&mtr);
...@@ -18016,6 +18024,7 @@ innodb_make_page_dirty( ...@@ -18016,6 +18024,7 @@ innodb_make_page_dirty(
MLOG_2BYTES, &mtr); MLOG_2BYTES, &mtr);
} }
mtr_commit(&mtr); mtr_commit(&mtr);
mysql_mutex_lock(&LOCK_global_system_variables);
} }
#endif // UNIV_DEBUG #endif // UNIV_DEBUG
...@@ -18661,8 +18670,11 @@ innodb_buffer_pool_evict_update( ...@@ -18661,8 +18670,11 @@ innodb_buffer_pool_evict_update(
{ {
if (const char* op = *static_cast<const char*const*>(save)) { if (const char* op = *static_cast<const char*const*>(save)) {
if (!strcmp(op, "uncompressed")) { if (!strcmp(op, "uncompressed")) {
mysql_mutex_unlock(&LOCK_global_system_variables);
for (uint tries = 0; tries < 10000; tries++) { for (uint tries = 0; tries < 10000; tries++) {
if (innodb_buffer_pool_evict_uncompressed()) { if (innodb_buffer_pool_evict_uncompressed()) {
mysql_mutex_lock(
&LOCK_global_system_variables);
return; return;
} }
...@@ -19199,7 +19211,9 @@ purge_run_now_set( ...@@ -19199,7 +19211,9 @@ purge_run_now_set(
check function */ check function */
{ {
if (*(my_bool*) save && trx_purge_state() != PURGE_STATE_DISABLED) { if (*(my_bool*) save && trx_purge_state() != PURGE_STATE_DISABLED) {
mysql_mutex_unlock(&LOCK_global_system_variables);
trx_purge_run(); trx_purge_run();
mysql_mutex_lock(&LOCK_global_system_variables);
} }
} }
...@@ -19222,7 +19236,9 @@ purge_stop_now_set( ...@@ -19222,7 +19236,9 @@ purge_stop_now_set(
check function */ check function */
{ {
if (*(my_bool*) save && trx_purge_state() != PURGE_STATE_DISABLED) { if (*(my_bool*) save && trx_purge_state() != PURGE_STATE_DISABLED) {
mysql_mutex_unlock(&LOCK_global_system_variables);
trx_purge_stop(); trx_purge_stop();
mysql_mutex_lock(&LOCK_global_system_variables);
} }
} }
...@@ -19244,6 +19260,8 @@ checkpoint_now_set( ...@@ -19244,6 +19260,8 @@ checkpoint_now_set(
check function */ check function */
{ {
if (*(my_bool*) save) { if (*(my_bool*) save) {
mysql_mutex_unlock(&LOCK_global_system_variables);
while (log_sys->last_checkpoint_lsn < log_sys->lsn) { while (log_sys->last_checkpoint_lsn < log_sys->lsn) {
log_make_checkpoint_at(LSN_MAX, TRUE); log_make_checkpoint_at(LSN_MAX, TRUE);
fil_flush_file_spaces(FIL_LOG); fil_flush_file_spaces(FIL_LOG);
...@@ -19257,6 +19275,8 @@ checkpoint_now_set( ...@@ -19257,6 +19275,8 @@ checkpoint_now_set(
"system tablespace at checkpoint err=%s", "system tablespace at checkpoint err=%s",
ut_strerr(err)); ut_strerr(err));
} }
mysql_mutex_lock(&LOCK_global_system_variables);
} }
} }
...@@ -19278,8 +19298,10 @@ buf_flush_list_now_set( ...@@ -19278,8 +19298,10 @@ buf_flush_list_now_set(
check function */ check function */
{ {
if (*(my_bool*) save) { if (*(my_bool*) save) {
mysql_mutex_unlock(&LOCK_global_system_variables);
buf_flush_list(ULINT_MAX, LSN_MAX, NULL); buf_flush_list(ULINT_MAX, LSN_MAX, NULL);
buf_flush_wait_batch_end(NULL, BUF_FLUSH_LIST); buf_flush_wait_batch_end(NULL, BUF_FLUSH_LIST);
mysql_mutex_lock(&LOCK_global_system_variables);
} }
} }
...@@ -19406,7 +19428,9 @@ buffer_pool_dump_now( ...@@ -19406,7 +19428,9 @@ buffer_pool_dump_now(
check function */ check function */
{ {
if (*(my_bool*) save && !srv_read_only_mode) { if (*(my_bool*) save && !srv_read_only_mode) {
mysql_mutex_unlock(&LOCK_global_system_variables);
buf_dump_start(); buf_dump_start();
mysql_mutex_lock(&LOCK_global_system_variables);
} }
} }
...@@ -19429,7 +19453,9 @@ buffer_pool_load_now( ...@@ -19429,7 +19453,9 @@ buffer_pool_load_now(
check function */ check function */
{ {
if (*(my_bool*) save && !srv_read_only_mode) { if (*(my_bool*) save && !srv_read_only_mode) {
mysql_mutex_unlock(&LOCK_global_system_variables);
buf_load_start(); buf_load_start();
mysql_mutex_lock(&LOCK_global_system_variables);
} }
} }
...@@ -19452,96 +19478,71 @@ buffer_pool_load_abort( ...@@ -19452,96 +19478,71 @@ buffer_pool_load_abort(
check function */ check function */
{ {
if (*(my_bool*) save && !srv_read_only_mode) { if (*(my_bool*) save && !srv_read_only_mode) {
mysql_mutex_unlock(&LOCK_global_system_variables);
buf_load_abort(); buf_load_abort();
mysql_mutex_lock(&LOCK_global_system_variables);
} }
} }
/** Update innodb_status_output or innodb_status_output_locks, /** Update innodb_status_output or innodb_status_output_locks,
which control InnoDB "status monitor" output to the error log. which control InnoDB "status monitor" output to the error log.
@param[in] thd thread handle @param[out] var current value
@param[in] var system variable
@param[out] var_ptr current value
@param[in] save to-be-assigned value */ @param[in] save to-be-assigned value */
static static
void void
innodb_status_output_update( innodb_status_output_update(THD*,st_mysql_sys_var*,void*var,const void*save)
/*========================*/
THD* thd __attribute__((unused)),
struct st_mysql_sys_var* var __attribute__((unused)),
void* var_ptr __attribute__((unused)),
const void* save __attribute__((unused)))
{ {
*static_cast<my_bool*>(var_ptr) = *static_cast<const my_bool*>(save); *static_cast<my_bool*>(var) = *static_cast<const my_bool*>(save);
mysql_mutex_unlock(&LOCK_global_system_variables);
/* Wakeup server monitor thread. */ /* Wakeup server monitor thread. */
os_event_set(srv_monitor_event); os_event_set(srv_monitor_event);
mysql_mutex_lock(&LOCK_global_system_variables);
} }
/****************************************************************** /** Update the system variable innodb_encryption_threads.
Update the system variable innodb_encryption_threads */ @param[in] save to-be-assigned value */
static static
void void
innodb_encryption_threads_update( innodb_encryption_threads_update(THD*,st_mysql_sys_var*,void*,const void*save)
/*=============================*/
THD* thd, /*!< in: thread handle */
struct st_mysql_sys_var* var, /*!< in: pointer to
system variable */
void* var_ptr,/*!< out: where the
formal string goes */
const void* save) /*!< in: immediate result
from check function */
{ {
mysql_mutex_unlock(&LOCK_global_system_variables);
fil_crypt_set_thread_cnt(*static_cast<const uint*>(save)); fil_crypt_set_thread_cnt(*static_cast<const uint*>(save));
mysql_mutex_lock(&LOCK_global_system_variables);
} }
/****************************************************************** /** Update the system variable innodb_encryption_rotate_key_age.
Update the system variable innodb_encryption_rotate_key_age */ @param[in] save to-be-assigned value */
static static
void void
innodb_encryption_rotate_key_age_update( innodb_encryption_rotate_key_age_update(THD*,st_mysql_sys_var*,void*,
/*====================================*/ const void*save)
THD* thd, /*!< in: thread handle */
struct st_mysql_sys_var* var, /*!< in: pointer to
system variable */
void* var_ptr,/*!< out: where the
formal string goes */
const void* save) /*!< in: immediate result
from check function */
{ {
mysql_mutex_unlock(&LOCK_global_system_variables);
fil_crypt_set_rotate_key_age(*static_cast<const uint*>(save)); fil_crypt_set_rotate_key_age(*static_cast<const uint*>(save));
mysql_mutex_lock(&LOCK_global_system_variables);
} }
/****************************************************************** /** Update the system variable innodb_encryption_rotation_iops.
Update the system variable innodb_encryption_rotation_iops */ @param[in] save to-be-assigned value */
static static
void void
innodb_encryption_rotation_iops_update( innodb_encryption_rotation_iops_update(THD*,st_mysql_sys_var*,void*,
/*===================================*/ const void*save)
THD* thd, /*!< in: thread handle */
struct st_mysql_sys_var* var, /*!< in: pointer to
system variable */
void* var_ptr,/*!< out: where the
formal string goes */
const void* save) /*!< in: immediate result
from check function */
{ {
mysql_mutex_unlock(&LOCK_global_system_variables);
fil_crypt_set_rotation_iops(*static_cast<const uint*>(save)); fil_crypt_set_rotation_iops(*static_cast<const uint*>(save));
mysql_mutex_lock(&LOCK_global_system_variables);
} }
/****************************************************************** /** Update the system variable innodb_encrypt_tables.
Update the system variable innodb_encrypt_tables*/ @param[in] save to-be-assigned value */
static static
void void
innodb_encrypt_tables_update( innodb_encrypt_tables_update(THD*,st_mysql_sys_var*,void*,const void*save)
/*=========================*/
THD* thd, /*!< in: thread handle */
struct st_mysql_sys_var* var, /*!< in: pointer to
system variable */
void* var_ptr,/*!< out: where the
formal string goes */
const void* save) /*!< in: immediate result
from check function */
{ {
mysql_mutex_unlock(&LOCK_global_system_variables);
fil_crypt_set_encrypt_tables(*static_cast<const ulong*>(save)); fil_crypt_set_encrypt_tables(*static_cast<const ulong*>(save));
mysql_mutex_lock(&LOCK_global_system_variables);
} }
static SHOW_VAR innodb_status_variables_export[]= { static SHOW_VAR innodb_status_variables_export[]= {
...@@ -20979,12 +20980,15 @@ innobase_disallow_writes_update( ...@@ -20979,12 +20980,15 @@ innobase_disallow_writes_update(
variable */ variable */
const void* save) /* in: temporary storage */ const void* save) /* in: temporary storage */
{ {
*(my_bool*)var_ptr = *(my_bool*)save; const my_bool val = *static_cast<const my_bool*>(save);
*static_cast<my_bool*>(var_ptr) = val;
ut_a(srv_allow_writes_event); ut_a(srv_allow_writes_event);
if (*(my_bool*)var_ptr) mysql_mutex_unlock(&LOCK_global_system_variables);
if (val)
os_event_reset(srv_allow_writes_event); os_event_reset(srv_allow_writes_event);
else else
os_event_set(srv_allow_writes_event); os_event_set(srv_allow_writes_event);
mysql_mutex_lock(&LOCK_global_system_variables);
} }
static MYSQL_SYSVAR_BOOL(disallow_writes, innobase_disallow_writes, static MYSQL_SYSVAR_BOOL(disallow_writes, innobase_disallow_writes,
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, 2018, MariaDB Corporation. Copyright (c) 2017, 2019, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -208,13 +208,13 @@ buf_LRU_make_block_old( ...@@ -208,13 +208,13 @@ buf_LRU_make_block_old(
Updates buf_pool->LRU_old_ratio. Updates buf_pool->LRU_old_ratio.
@return updated old_pct */ @return updated old_pct */
UNIV_INTERN UNIV_INTERN
ulint uint
buf_LRU_old_ratio_update( buf_LRU_old_ratio_update(
/*=====================*/ /*=====================*/
uint old_pct,/*!< in: Reserve this percentage of uint old_pct,/*!< in: Reserve this percentage of
the buffer pool for "old" blocks. */ the buffer pool for "old" blocks. */
ibool adjust);/*!< in: TRUE=adjust the LRU list; bool adjust);/*!< in: true=adjust the LRU list;
FALSE=just assign buf_pool->LRU_old_ratio false=just assign buf_pool->LRU_old_ratio
during the initialization of InnoDB */ during the initialization of InnoDB */
/********************************************************************//** /********************************************************************//**
Update the historical stats that we are collecting for LRU eviction Update the historical stats that we are collecting for LRU eviction
......
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