Commit e36d6f03 authored by Michael Widenius's avatar Michael Widenius

Don't use LOCK_status for the duration of SHOW STATUS because of possible lookups.

Instead we use LOCK_status only to protect summary of thread statistics and use a new mutex, LOCK_show_status
to protect concurrent SHOW STATUS.

sql/mysqld.cc:
  Add LOCK_show_status
  Don't free LOCK_status while calculating status variables.
sql/mysqld.h:
  Add LOCK_show_status
sql/sql_show.cc:
  Use LOCK_show_status to protect SHOW STATUS instead of LOCK_status.
parent 9276e0e9
...@@ -703,7 +703,7 @@ pthread_key(MEM_ROOT**,THR_MALLOC); ...@@ -703,7 +703,7 @@ pthread_key(MEM_ROOT**,THR_MALLOC);
pthread_key(THD*, THR_THD); pthread_key(THD*, THR_THD);
mysql_mutex_t LOCK_thread_count, LOCK_thread_cache; mysql_mutex_t LOCK_thread_count, LOCK_thread_cache;
mysql_mutex_t mysql_mutex_t
LOCK_status, LOCK_error_log, LOCK_short_uuid_generator, LOCK_status, LOCK_show_status, LOCK_error_log, LOCK_short_uuid_generator,
LOCK_delayed_insert, LOCK_delayed_status, LOCK_delayed_create, LOCK_delayed_insert, LOCK_delayed_status, LOCK_delayed_create,
LOCK_crypt, LOCK_crypt,
LOCK_global_system_variables, LOCK_global_system_variables,
...@@ -860,7 +860,8 @@ PSI_mutex_key key_BINLOG_LOCK_index, key_BINLOG_LOCK_xid_list, ...@@ -860,7 +860,8 @@ PSI_mutex_key key_BINLOG_LOCK_index, key_BINLOG_LOCK_xid_list,
key_LOCK_gdl, key_LOCK_global_system_variables, key_LOCK_gdl, key_LOCK_global_system_variables,
key_LOCK_manager, key_LOCK_manager,
key_LOCK_prepared_stmt_count, key_LOCK_prepared_stmt_count,
key_LOCK_rpl_status, key_LOCK_server_started, key_LOCK_status, key_LOCK_rpl_status, key_LOCK_server_started,
key_LOCK_status, key_LOCK_show_status,
key_LOCK_system_variables_hash, key_LOCK_thd_data, key_LOCK_system_variables_hash, key_LOCK_thd_data,
key_LOCK_user_conn, key_LOCK_uuid_short_generator, key_LOG_LOCK_log, key_LOCK_user_conn, key_LOCK_uuid_short_generator, key_LOG_LOCK_log,
key_master_info_data_lock, key_master_info_run_lock, key_master_info_data_lock, key_master_info_run_lock,
...@@ -920,6 +921,7 @@ static PSI_mutex_info all_server_mutexes[]= ...@@ -920,6 +921,7 @@ static PSI_mutex_info all_server_mutexes[]=
{ &key_LOCK_rpl_status, "LOCK_rpl_status", PSI_FLAG_GLOBAL}, { &key_LOCK_rpl_status, "LOCK_rpl_status", PSI_FLAG_GLOBAL},
{ &key_LOCK_server_started, "LOCK_server_started", PSI_FLAG_GLOBAL}, { &key_LOCK_server_started, "LOCK_server_started", PSI_FLAG_GLOBAL},
{ &key_LOCK_status, "LOCK_status", PSI_FLAG_GLOBAL}, { &key_LOCK_status, "LOCK_status", PSI_FLAG_GLOBAL},
{ &key_LOCK_show_status, "LOCK_show_status", PSI_FLAG_GLOBAL},
{ &key_LOCK_system_variables_hash, "LOCK_system_variables_hash", PSI_FLAG_GLOBAL}, { &key_LOCK_system_variables_hash, "LOCK_system_variables_hash", PSI_FLAG_GLOBAL},
{ &key_LOCK_stats, "LOCK_stats", PSI_FLAG_GLOBAL}, { &key_LOCK_stats, "LOCK_stats", PSI_FLAG_GLOBAL},
{ &key_LOCK_global_user_client_stats, "LOCK_global_user_client_stats", PSI_FLAG_GLOBAL}, { &key_LOCK_global_user_client_stats, "LOCK_global_user_client_stats", PSI_FLAG_GLOBAL},
...@@ -2136,6 +2138,7 @@ static void clean_up_mutexes() ...@@ -2136,6 +2138,7 @@ static void clean_up_mutexes()
mysql_mutex_destroy(&LOCK_thread_count); mysql_mutex_destroy(&LOCK_thread_count);
mysql_mutex_destroy(&LOCK_thread_cache); mysql_mutex_destroy(&LOCK_thread_cache);
mysql_mutex_destroy(&LOCK_status); mysql_mutex_destroy(&LOCK_status);
mysql_mutex_destroy(&LOCK_show_status);
mysql_mutex_destroy(&LOCK_delayed_insert); mysql_mutex_destroy(&LOCK_delayed_insert);
mysql_mutex_destroy(&LOCK_delayed_status); mysql_mutex_destroy(&LOCK_delayed_status);
mysql_mutex_destroy(&LOCK_delayed_create); mysql_mutex_destroy(&LOCK_delayed_create);
...@@ -4376,6 +4379,7 @@ static int init_thread_environment() ...@@ -4376,6 +4379,7 @@ static int init_thread_environment()
mysql_mutex_init(key_LOCK_thread_count, &LOCK_thread_count, MY_MUTEX_INIT_FAST); mysql_mutex_init(key_LOCK_thread_count, &LOCK_thread_count, MY_MUTEX_INIT_FAST);
mysql_mutex_init(key_LOCK_thread_cache, &LOCK_thread_cache, MY_MUTEX_INIT_FAST); mysql_mutex_init(key_LOCK_thread_cache, &LOCK_thread_cache, MY_MUTEX_INIT_FAST);
mysql_mutex_init(key_LOCK_status, &LOCK_status, MY_MUTEX_INIT_FAST); mysql_mutex_init(key_LOCK_status, &LOCK_status, MY_MUTEX_INIT_FAST);
mysql_mutex_init(key_LOCK_show_status, &LOCK_show_status, MY_MUTEX_INIT_SLOW);
mysql_mutex_init(key_LOCK_delayed_insert, mysql_mutex_init(key_LOCK_delayed_insert,
&LOCK_delayed_insert, MY_MUTEX_INIT_FAST); &LOCK_delayed_insert, MY_MUTEX_INIT_FAST);
mysql_mutex_init(key_LOCK_delayed_status, mysql_mutex_init(key_LOCK_delayed_status,
...@@ -6238,7 +6242,8 @@ void handle_connections_sockets() ...@@ -6238,7 +6242,8 @@ void handle_connections_sockets()
(void) mysql_socket_close(new_sock); (void) mysql_socket_close(new_sock);
/* /*
The connection was refused by TCP wrappers. The connection was refused by TCP wrappers.
There are no details (by client IP) available to update the host_cache. There are no details (by client IP) available to update the
host_cache.
*/ */
statistic_increment(connection_errors_tcpwrap, &LOCK_status); statistic_increment(connection_errors_tcpwrap, &LOCK_status);
continue; continue;
...@@ -7232,7 +7237,6 @@ static int show_slave_running(THD *thd, SHOW_VAR *var, char *buff) ...@@ -7232,7 +7237,6 @@ static int show_slave_running(THD *thd, SHOW_VAR *var, char *buff)
var->type= SHOW_MY_BOOL; var->type= SHOW_MY_BOOL;
var->value= buff; var->value= buff;
mysql_mutex_unlock(&LOCK_status);
mysql_mutex_lock(&LOCK_active_mi); mysql_mutex_lock(&LOCK_active_mi);
if (master_info_index) if (master_info_index)
{ {
...@@ -7244,7 +7248,6 @@ static int show_slave_running(THD *thd, SHOW_VAR *var, char *buff) ...@@ -7244,7 +7248,6 @@ static int show_slave_running(THD *thd, SHOW_VAR *var, char *buff)
mi->rli.slave_running); mi->rli.slave_running);
} }
mysql_mutex_unlock(&LOCK_active_mi); mysql_mutex_unlock(&LOCK_active_mi);
mysql_mutex_lock(&LOCK_status);
if (mi) if (mi)
*((my_bool *)buff)= tmp; *((my_bool *)buff)= tmp;
else else
...@@ -7261,7 +7264,6 @@ static int show_slave_received_heartbeats(THD *thd, SHOW_VAR *var, char *buff) ...@@ -7261,7 +7264,6 @@ static int show_slave_received_heartbeats(THD *thd, SHOW_VAR *var, char *buff)
var->type= SHOW_LONGLONG; var->type= SHOW_LONGLONG;
var->value= buff; var->value= buff;
mysql_mutex_unlock(&LOCK_status);
mysql_mutex_lock(&LOCK_active_mi); mysql_mutex_lock(&LOCK_active_mi);
if (master_info_index) if (master_info_index)
{ {
...@@ -7272,7 +7274,6 @@ static int show_slave_received_heartbeats(THD *thd, SHOW_VAR *var, char *buff) ...@@ -7272,7 +7274,6 @@ static int show_slave_received_heartbeats(THD *thd, SHOW_VAR *var, char *buff)
tmp= mi->received_heartbeats; tmp= mi->received_heartbeats;
} }
mysql_mutex_unlock(&LOCK_active_mi); mysql_mutex_unlock(&LOCK_active_mi);
mysql_mutex_lock(&LOCK_status);
if (mi) if (mi)
*((longlong *)buff)= tmp; *((longlong *)buff)= tmp;
else else
...@@ -7289,7 +7290,6 @@ static int show_heartbeat_period(THD *thd, SHOW_VAR *var, char *buff) ...@@ -7289,7 +7290,6 @@ static int show_heartbeat_period(THD *thd, SHOW_VAR *var, char *buff)
var->type= SHOW_CHAR; var->type= SHOW_CHAR;
var->value= buff; var->value= buff;
mysql_mutex_unlock(&LOCK_status);
mysql_mutex_lock(&LOCK_active_mi); mysql_mutex_lock(&LOCK_active_mi);
if (master_info_index) if (master_info_index)
{ {
...@@ -7300,7 +7300,6 @@ static int show_heartbeat_period(THD *thd, SHOW_VAR *var, char *buff) ...@@ -7300,7 +7300,6 @@ static int show_heartbeat_period(THD *thd, SHOW_VAR *var, char *buff)
tmp= mi->heartbeat_period; tmp= mi->heartbeat_period;
} }
mysql_mutex_unlock(&LOCK_active_mi); mysql_mutex_unlock(&LOCK_active_mi);
mysql_mutex_lock(&LOCK_status);
if (mi) if (mi)
sprintf(buff, "%.3f", tmp); sprintf(buff, "%.3f", tmp);
else else
......
...@@ -257,7 +257,8 @@ extern PSI_mutex_key key_BINLOG_LOCK_index, key_BINLOG_LOCK_xid_list, ...@@ -257,7 +257,8 @@ extern PSI_mutex_key key_BINLOG_LOCK_index, key_BINLOG_LOCK_xid_list,
key_LOCK_gdl, key_LOCK_global_system_variables, key_LOCK_gdl, key_LOCK_global_system_variables,
key_LOCK_logger, key_LOCK_manager, key_LOCK_logger, key_LOCK_manager,
key_LOCK_prepared_stmt_count, key_LOCK_prepared_stmt_count,
key_LOCK_rpl_status, key_LOCK_server_started, key_LOCK_status, key_LOCK_rpl_status, key_LOCK_server_started,
key_LOCK_status, key_LOCK_show_status,
key_LOCK_thd_data, key_LOCK_thd_data,
key_LOCK_user_conn, key_LOG_LOCK_log, key_LOCK_user_conn, key_LOG_LOCK_log,
key_master_info_data_lock, key_master_info_run_lock, key_master_info_data_lock, key_master_info_run_lock,
...@@ -513,7 +514,7 @@ extern MYSQL_PLUGIN_IMPORT key_map key_map_full; /* Should be threaded ...@@ -513,7 +514,7 @@ extern MYSQL_PLUGIN_IMPORT key_map key_map_full; /* Should be threaded
Server mutex locks and condition variables. Server mutex locks and condition variables.
*/ */
extern mysql_mutex_t extern mysql_mutex_t
LOCK_item_func_sleep, LOCK_status, LOCK_item_func_sleep, LOCK_status, LOCK_show_status,
LOCK_error_log, LOCK_delayed_insert, LOCK_short_uuid_generator, LOCK_error_log, LOCK_delayed_insert, LOCK_short_uuid_generator,
LOCK_delayed_status, LOCK_delayed_create, LOCK_crypt, LOCK_timezone, LOCK_delayed_status, LOCK_delayed_create, LOCK_crypt, LOCK_timezone,
LOCK_slave_list, LOCK_active_mi, LOCK_manager, LOCK_slave_list, LOCK_active_mi, LOCK_manager,
......
...@@ -7342,14 +7342,20 @@ int fill_status(THD *thd, TABLE_LIST *tables, COND *cond) ...@@ -7342,14 +7342,20 @@ int fill_status(THD *thd, TABLE_LIST *tables, COND *cond)
if (partial_cond) if (partial_cond)
partial_cond->val_int(); partial_cond->val_int();
mysql_mutex_lock(&LOCK_status);
if (option_type == OPT_GLOBAL) if (option_type == OPT_GLOBAL)
{
/* We only hold LOCK_status for summary status vars */
mysql_mutex_lock(&LOCK_status);
calc_sum_of_all_status(&tmp); calc_sum_of_all_status(&tmp);
mysql_mutex_unlock(&LOCK_status);
}
mysql_mutex_lock(&LOCK_show_status);
res= show_status_array(thd, wild, res= show_status_array(thd, wild,
(SHOW_VAR *)all_status_vars.buffer, (SHOW_VAR *)all_status_vars.buffer,
option_type, tmp1, "", tables->table, option_type, tmp1, "", tables->table,
upper_case_names, partial_cond); upper_case_names, partial_cond);
mysql_mutex_unlock(&LOCK_status); mysql_mutex_unlock(&LOCK_show_status);
DBUG_RETURN(res); DBUG_RETURN(res);
} }
......
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