mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
MDEV-6150 Speed up connection speed by moving creation of THD to new thread
Creating a CONNECT object on client connect and pass this to the working thread which creates the THD. Split LOCK_thread_count to different mutexes Added LOCK_thread_start to syncronize threads Moved most usage of LOCK_thread_count to dedicated functions Use next_thread_id() instead of thread_id++ Other things: - Thread id now starts from 1 instead of 2 - Added cast for thread_id as thread id is now of type my_thread_id - Made THD->host const (To ensure it's not changed) - Removed some DBUG_PRINT() about entering/exiting mutex as these was already logged by mutex code - Fixed that aborted_connects and connection_errors_internal are counted in all cases - Don't take locks for current_linfo when we set it (not needed as it was 0 before)
This commit is contained in:
64
sql/slave.cc
64
sql/slave.cc
@@ -294,9 +294,7 @@ handle_slave_init(void *arg __attribute__((unused)))
|
||||
my_thread_init();
|
||||
thd= new THD;
|
||||
thd->thread_stack= (char*) &thd; /* Set approximate stack start */
|
||||
mysql_mutex_lock(&LOCK_thread_count);
|
||||
thd->thread_id= thread_id++;
|
||||
mysql_mutex_unlock(&LOCK_thread_count);
|
||||
thd->thread_id= next_thread_id();
|
||||
thd->system_thread = SYSTEM_THREAD_SLAVE_INIT;
|
||||
thread_safe_increment32(&service_thread_count);
|
||||
thd->store_globals();
|
||||
@@ -310,19 +308,17 @@ handle_slave_init(void *arg __attribute__((unused)))
|
||||
rpl_gtid_slave_state_table_name.str,
|
||||
thd->get_stmt_da()->sql_errno(),
|
||||
thd->get_stmt_da()->message());
|
||||
|
||||
mysql_mutex_lock(&LOCK_thread_count);
|
||||
delete thd;
|
||||
mysql_mutex_unlock(&LOCK_thread_count);
|
||||
thread_safe_decrement32(&service_thread_count);
|
||||
signal_thd_deleted();
|
||||
my_thread_end();
|
||||
|
||||
mysql_mutex_lock(&LOCK_slave_init);
|
||||
/* Signal run_slave_init_thread() that we are done */
|
||||
|
||||
mysql_mutex_lock(&LOCK_start_thread);
|
||||
slave_init_thread_running= false;
|
||||
mysql_cond_broadcast(&COND_slave_init);
|
||||
mysql_mutex_unlock(&LOCK_slave_init);
|
||||
mysql_cond_broadcast(&COND_start_thread);
|
||||
mysql_mutex_unlock(&LOCK_start_thread);
|
||||
|
||||
my_thread_end();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -347,11 +343,10 @@ run_slave_init_thread()
|
||||
return 1;
|
||||
}
|
||||
|
||||
mysql_mutex_lock(&LOCK_slave_init);
|
||||
mysql_mutex_lock(&LOCK_start_thread);
|
||||
while (slave_init_thread_running)
|
||||
mysql_cond_wait(&COND_slave_init, &LOCK_slave_init);
|
||||
mysql_mutex_unlock(&LOCK_slave_init);
|
||||
|
||||
mysql_cond_wait(&COND_start_thread, &LOCK_start_thread);
|
||||
mysql_mutex_unlock(&LOCK_start_thread);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -3076,9 +3071,7 @@ static int init_slave_thread(THD* thd, Master_info *mi,
|
||||
thd->variables.log_slow_filter= global_system_variables.log_slow_filter;
|
||||
set_slave_thread_options(thd);
|
||||
thd->client_capabilities = CLIENT_LOCAL_FILES;
|
||||
mysql_mutex_lock(&LOCK_thread_count);
|
||||
thd->thread_id= thd->variables.pseudo_thread_id= thread_id++;
|
||||
mysql_mutex_unlock(&LOCK_thread_count);
|
||||
thd->thread_id= thd->variables.pseudo_thread_id= next_thread_id();
|
||||
|
||||
if (thd_type == SLAVE_THD_SQL)
|
||||
THD_STAGE_INFO(thd, stage_waiting_for_the_next_event_in_relay_log);
|
||||
@@ -3970,9 +3963,7 @@ pthread_handler_t handle_slave_io(void *arg)
|
||||
goto err_during_init;
|
||||
}
|
||||
thd->system_thread_info.rpl_io_info= &io_info;
|
||||
mysql_mutex_lock(&LOCK_thread_count);
|
||||
threads.append(thd);
|
||||
mysql_mutex_unlock(&LOCK_thread_count);
|
||||
add_to_active_threads(thd);
|
||||
mi->slave_running = MYSQL_SLAVE_RUN_NOT_CONNECT;
|
||||
mi->abort_slave = 0;
|
||||
mysql_mutex_unlock(&mi->run_lock);
|
||||
@@ -4295,6 +4286,7 @@ err:
|
||||
flush_master_info(mi, TRUE, TRUE);
|
||||
THD_STAGE_INFO(thd, stage_waiting_for_slave_mutex_on_exit);
|
||||
thd->add_status_to_global();
|
||||
unlink_not_visible_thd(thd);
|
||||
mysql_mutex_lock(&mi->run_lock);
|
||||
|
||||
err_during_init:
|
||||
@@ -4354,7 +4346,8 @@ int check_temp_dir(char* tmp_file)
|
||||
size_t tmp_dir_size;
|
||||
DBUG_ENTER("check_temp_dir");
|
||||
|
||||
mysql_mutex_lock(&LOCK_thread_count);
|
||||
/* This look is safe to use as this function is only called once */
|
||||
mysql_mutex_lock(&LOCK_start_thread);
|
||||
if (check_temp_dir_run)
|
||||
{
|
||||
result= check_temp_dir_result;
|
||||
@@ -4393,7 +4386,7 @@ int check_temp_dir(char* tmp_file)
|
||||
|
||||
end:
|
||||
check_temp_dir_result= result;
|
||||
mysql_mutex_unlock(&LOCK_thread_count);
|
||||
mysql_mutex_unlock(&LOCK_start_thread);
|
||||
DBUG_RETURN(result);
|
||||
}
|
||||
|
||||
@@ -4571,9 +4564,7 @@ pthread_handler_t handle_slave_sql(void *arg)
|
||||
applied. In all other cases it must be FALSE.
|
||||
*/
|
||||
thd->variables.binlog_annotate_row_events= 0;
|
||||
mysql_mutex_lock(&LOCK_thread_count);
|
||||
threads.append(thd);
|
||||
mysql_mutex_unlock(&LOCK_thread_count);
|
||||
add_to_active_threads(thd);
|
||||
/*
|
||||
We are going to set slave_running to 1. Assuming slave I/O thread is
|
||||
alive and connected, this is going to make Seconds_Behind_Master be 0
|
||||
@@ -4882,7 +4873,9 @@ pthread_handler_t handle_slave_sql(void *arg)
|
||||
}
|
||||
THD_STAGE_INFO(thd, stage_waiting_for_slave_mutex_on_exit);
|
||||
thd->add_status_to_global();
|
||||
unlink_not_visible_thd(thd);
|
||||
mysql_mutex_lock(&rli->run_lock);
|
||||
|
||||
err_during_init:
|
||||
/* We need data_lock, at least to wake up any waiting master_pos_wait() */
|
||||
mysql_mutex_lock(&rli->data_lock);
|
||||
@@ -4906,12 +4899,8 @@ err_during_init:
|
||||
to avoid unneeded position re-init
|
||||
*/
|
||||
thd->temporary_tables = 0; // remove tempation from destructor to close them
|
||||
THD_CHECK_SENTRY(thd);
|
||||
rli->sql_driver_thd= 0;
|
||||
mysql_mutex_lock(&LOCK_thread_count);
|
||||
thd->rgi_fake= thd->rgi_slave= NULL;
|
||||
delete serial_rgi;
|
||||
mysql_mutex_unlock(&LOCK_thread_count);
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
/*
|
||||
@@ -4940,10 +4929,11 @@ err_during_init:
|
||||
#endif /* WITH_WSREP */
|
||||
|
||||
/*
|
||||
Note: the order of the broadcast and unlock calls below (first broadcast, then unlock)
|
||||
is important. Otherwise a killer_thread can execute between the calls and
|
||||
delete the mi structure leading to a crash! (see BUG#25306 for details)
|
||||
*/
|
||||
Note: the order of the broadcast and unlock calls below (first
|
||||
broadcast, then unlock) is important. Otherwise a killer_thread can
|
||||
execute between the calls and delete the mi structure leading to a
|
||||
crash! (see BUG#25306 for details)
|
||||
*/
|
||||
mysql_cond_broadcast(&rli->stop_cond);
|
||||
DBUG_EXECUTE_IF("simulate_slave_delay_at_terminate_bug38694", sleep(5););
|
||||
mysql_mutex_unlock(&rli->run_lock); // tell the world we are done
|
||||
@@ -4959,9 +4949,13 @@ err_during_init:
|
||||
rpl_parallel_inactivate_pool(&global_rpl_thread_pool);
|
||||
mysql_mutex_unlock(&LOCK_active_mi);
|
||||
|
||||
/* TODO: Check if this lock is needed */
|
||||
mysql_mutex_lock(&LOCK_thread_count);
|
||||
delete thd;
|
||||
delete serial_rgi;
|
||||
mysql_mutex_unlock(&LOCK_thread_count);
|
||||
|
||||
THD_CHECK_SENTRY(thd);
|
||||
delete thd;
|
||||
thread_safe_decrement32(&service_thread_count);
|
||||
signal_thd_deleted();
|
||||
|
||||
|
Reference in New Issue
Block a user