mirror of
https://github.com/MariaDB/server.git
synced 2025-07-04 01:23:45 +03:00
Move thread re-initialisation out of cache_thread
It mostly duplicates code of do_handle_one_connection(). Move it there, so that it is easier to simplify it in future. Moved PSI_CALL_delete_current_thread()/_db_pop_() out of mutex. Call them consistently in all cases, unlike before: - called for reused threads - called for flushed threads - called for threads that go down after 5 minutes timeout - not called for threads attempting to cache themselves during flush - not called for threads attempting to cache themselves when cache is full Part of MDEV-19515 - Improve connect speed
This commit is contained in:
@ -2663,31 +2663,30 @@ void unlink_thd(THD *thd)
|
||||
*/
|
||||
|
||||
|
||||
bool cache_thread(THD *thd)
|
||||
CONNECT *cache_thread(THD *thd)
|
||||
{
|
||||
struct timespec abstime;
|
||||
DBUG_ENTER("cache_thread");
|
||||
DBUG_ASSERT(thd);
|
||||
set_timespec(abstime, THREAD_CACHE_TIMEOUT);
|
||||
|
||||
/*
|
||||
Delete the instrumentation for the job that just completed,
|
||||
before parking this pthread in the cache (blocked on COND_thread_cache).
|
||||
*/
|
||||
PSI_CALL_delete_current_thread();
|
||||
|
||||
#ifndef DBUG_OFF
|
||||
while (_db_is_pushed_())
|
||||
_db_pop_();
|
||||
#endif
|
||||
|
||||
mysql_mutex_lock(&LOCK_thread_cache);
|
||||
if (cached_thread_count < thread_cache_size && !kill_cached_threads)
|
||||
{
|
||||
/* Don't kill the thread, just put it in cache for reuse */
|
||||
DBUG_PRINT("info", ("Adding thread to cache"));
|
||||
cached_thread_count++;
|
||||
|
||||
/*
|
||||
Delete the instrumentation for the job that just completed,
|
||||
before parking this pthread in the cache (blocked on COND_thread_cache).
|
||||
*/
|
||||
PSI_CALL_delete_current_thread();
|
||||
|
||||
#ifndef DBUG_OFF
|
||||
while (_db_is_pushed_())
|
||||
_db_pop_();
|
||||
#endif
|
||||
|
||||
while (!wake_thread)
|
||||
{
|
||||
int error= mysql_cond_timedwait(&COND_thread_cache, &LOCK_thread_cache,
|
||||
@ -2712,35 +2711,7 @@ bool cache_thread(THD *thd)
|
||||
{
|
||||
wake_thread--;
|
||||
mysql_mutex_unlock(&LOCK_thread_cache);
|
||||
|
||||
if (!(connect->create_thd(thd)))
|
||||
{
|
||||
/* Out of resources. Free thread to get more resources */
|
||||
connect->close_and_delete();
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
delete connect;
|
||||
|
||||
/*
|
||||
We have to call store_globals to update mysys_var->id and lock_info
|
||||
with the new thread_id
|
||||
*/
|
||||
thd->store_globals();
|
||||
|
||||
/*
|
||||
Create new instrumentation for the new THD job,
|
||||
and attach it to this running pthread.
|
||||
*/
|
||||
PSI_CALL_set_thread(PSI_CALL_new_thread(key_thread_one_connection,
|
||||
thd, thd->thread_id));
|
||||
|
||||
/* reset abort flag for the thread */
|
||||
thd->mysys_var->abort= 0;
|
||||
thd->thr_create_utime= microsecond_interval_timer();
|
||||
thd->start_utime= thd->thr_create_utime;
|
||||
|
||||
server_threads.insert(thd);
|
||||
DBUG_RETURN(1);
|
||||
DBUG_RETURN(connect);
|
||||
}
|
||||
}
|
||||
mysql_mutex_unlock(&LOCK_thread_cache);
|
||||
|
@ -79,7 +79,7 @@ void close_connection(THD *thd, uint sql_errno= 0);
|
||||
void handle_connection_in_main_thread(CONNECT *thd);
|
||||
void create_thread_to_handle_connection(CONNECT *connect);
|
||||
void unlink_thd(THD *thd);
|
||||
bool cache_thread(THD *thd);
|
||||
CONNECT *cache_thread(THD *thd);
|
||||
void flush_thread_cache();
|
||||
void refresh_status(THD *thd);
|
||||
bool is_secure_file_path(char *path);
|
||||
|
@ -1426,8 +1426,36 @@ end_thread:
|
||||
|
||||
unlink_thd(thd);
|
||||
if (IF_WSREP(thd->wsrep_applier, false) || !put_in_cache ||
|
||||
!cache_thread(thd))
|
||||
!(connect= cache_thread(thd)))
|
||||
break;
|
||||
|
||||
if (!(connect->create_thd(thd)))
|
||||
{
|
||||
/* Out of resources. Free thread to get more resources */
|
||||
connect->close_and_delete();
|
||||
break;
|
||||
}
|
||||
delete connect;
|
||||
|
||||
/*
|
||||
We have to call store_globals to update mysys_var->id and lock_info
|
||||
with the new thread_id
|
||||
*/
|
||||
thd->store_globals();
|
||||
|
||||
/*
|
||||
Create new instrumentation for the new THD job,
|
||||
and attach it to this running pthread.
|
||||
*/
|
||||
PSI_CALL_set_thread(PSI_CALL_new_thread(key_thread_one_connection,
|
||||
thd, thd->thread_id));
|
||||
|
||||
/* reset abort flag for the thread */
|
||||
thd->mysys_var->abort= 0;
|
||||
thd->thr_create_utime= microsecond_interval_timer();
|
||||
thd->start_utime= thd->thr_create_utime;
|
||||
|
||||
server_threads.insert(thd);
|
||||
}
|
||||
delete thd;
|
||||
}
|
||||
|
Reference in New Issue
Block a user