diff options
author | Sergey Vojtovich <svoj@mariadb.org> | 2019-01-20 02:32:35 +0400 |
---|---|---|
committer | Sergey Vojtovich <svoj@mariadb.org> | 2019-01-28 17:39:07 +0400 |
commit | 3503fbbebf90cb0fe63993a66dad9bf97fb74c0a (patch) | |
tree | 1c39a1f4d4d694a8b2d1166cae48050fe82b6c1c /sql/sql_repl.cc | |
parent | 891be49a36ebb951cd90d64d1b4c1cc633af1fdf (diff) | |
download | mariadb-git-3503fbbebf90cb0fe63993a66dad9bf97fb74c0a.tar.gz |
Move THD list handling to THD_list
Implemented and integrated THD_list as a replacement for the global
thread list. It uses own mutex instead of LOCK_thread_count for THD
list protection.
Removed unused first_global_thread() and next_global_thread().
delayed_insert_threads is now protected by LOCK_delayed_insert. Although
this patch doesn't fix very wrong synchronization of this variable.
After this patch there are only 2 legitimate uses of LOCK_thread_count
left, both in mysqld.cc: thread_count and ready_to_exit.
Aim is to reduce usage of LOCK_thread_count and COND_thread_count.
Part of MDEV-15135.
Diffstat (limited to 'sql/sql_repl.cc')
-rw-r--r-- | sql/sql_repl.cc | 110 |
1 files changed, 54 insertions, 56 deletions
diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc index ab4a5c6a6b4..fc08399bb88 100644 --- a/sql/sql_repl.cc +++ b/sql/sql_repl.cc @@ -527,59 +527,48 @@ static enum enum_binlog_checksum_alg get_binlog_checksum_value_at_connect(THD * Now they sync is done for next read. */ -void adjust_linfo_offsets(my_off_t purge_offset) +static my_bool adjust_callback(THD *thd, my_off_t *purge_offset) { - THD *tmp; - - mysql_mutex_lock(&LOCK_thread_count); - I_List_iterator<THD> it(threads); - - while ((tmp=it++)) + mysql_mutex_lock(&thd->LOCK_thd_data); + if (auto linfo= thd->current_linfo) { - LOG_INFO* linfo; - mysql_mutex_lock(&tmp->LOCK_thd_data); - if ((linfo = tmp->current_linfo)) - { - /* - Index file offset can be less that purge offset only if - we just started reading the index file. In that case - we have nothing to adjust - */ - if (linfo->index_file_offset < purge_offset) - linfo->fatal = (linfo->index_file_offset != 0); - else - linfo->index_file_offset -= purge_offset; - } - mysql_mutex_unlock(&tmp->LOCK_thd_data); + /* + Index file offset can be less that purge offset only if + we just started reading the index file. In that case + we have nothing to adjust + */ + if (linfo->index_file_offset < *purge_offset) + linfo->fatal= (linfo->index_file_offset != 0); + else + linfo->index_file_offset-= *purge_offset; } - mysql_mutex_unlock(&LOCK_thread_count); + mysql_mutex_unlock(&thd->LOCK_thd_data); + return 0; } -bool log_in_use(const char* log_name) +void adjust_linfo_offsets(my_off_t purge_offset) { - size_t log_name_len = strlen(log_name) + 1; - THD *tmp; - bool result = 0; - - mysql_mutex_lock(&LOCK_thread_count); - I_List_iterator<THD> it(threads); + server_threads.iterate(adjust_callback, &purge_offset); +} - while ((tmp=it++)) - { - LOG_INFO* linfo; - mysql_mutex_lock(&tmp->LOCK_thd_data); - if ((linfo = tmp->current_linfo)) - result = !memcmp(log_name, linfo->log_file_name, log_name_len); - mysql_mutex_unlock(&tmp->LOCK_thd_data); - if (result) - break; - } - mysql_mutex_unlock(&LOCK_thread_count); +static my_bool log_in_use_callback(THD *thd, const char *log_name) +{ + my_bool result= 0; + mysql_mutex_lock(&thd->LOCK_thd_data); + if (auto linfo= thd->current_linfo) + result= !memcmp(log_name, linfo->log_file_name, strlen(log_name) + 1); + mysql_mutex_unlock(&thd->LOCK_thd_data); return result; } + +bool log_in_use(const char* log_name) +{ + return server_threads.iterate(log_in_use_callback, log_name); +} + bool purge_error_message(THD* thd, int res) { uint errcode; @@ -3367,31 +3356,40 @@ err: slave_server_id the slave's server id */ -void kill_zombie_dump_threads(uint32 slave_server_id) +struct kill_callback_arg { - mysql_mutex_lock(&LOCK_thread_count); - I_List_iterator<THD> it(threads); - THD *tmp; + kill_callback_arg(uint32 id): slave_server_id(id), thd(0) {} + uint32 slave_server_id; + THD *thd; +}; - while ((tmp=it++)) +static my_bool kill_callback(THD *thd, kill_callback_arg *arg) +{ + if (thd->get_command() == COM_BINLOG_DUMP && + thd->variables.server_id == arg->slave_server_id) { - if (tmp->get_command() == COM_BINLOG_DUMP && - tmp->variables.server_id == slave_server_id) - { - mysql_mutex_lock(&tmp->LOCK_thd_kill); // Lock from delete - break; - } + arg->thd= thd; + mysql_mutex_lock(&thd->LOCK_thd_kill); // Lock from delete + return 1; } - mysql_mutex_unlock(&LOCK_thread_count); - if (tmp) + return 0; +} + + +void kill_zombie_dump_threads(uint32 slave_server_id) +{ + kill_callback_arg arg(slave_server_id); + server_threads.iterate(kill_callback, &arg); + + if (arg.thd) { /* Here we do not call kill_one_thread() as it will be slow because it will iterate through the list again. We just to do kill the thread ourselves. */ - tmp->awake_no_mutex(KILL_SLAVE_SAME_ID); - mysql_mutex_unlock(&tmp->LOCK_thd_kill); + arg.thd->awake_no_mutex(KILL_SLAVE_SAME_ID); + mysql_mutex_unlock(&arg.thd->LOCK_thd_kill); } } |