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;
|
struct timespec abstime;
|
||||||
DBUG_ENTER("cache_thread");
|
DBUG_ENTER("cache_thread");
|
||||||
DBUG_ASSERT(thd);
|
DBUG_ASSERT(thd);
|
||||||
set_timespec(abstime, THREAD_CACHE_TIMEOUT);
|
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);
|
mysql_mutex_lock(&LOCK_thread_cache);
|
||||||
if (cached_thread_count < thread_cache_size && !kill_cached_threads)
|
if (cached_thread_count < thread_cache_size && !kill_cached_threads)
|
||||||
{
|
{
|
||||||
/* Don't kill the thread, just put it in cache for reuse */
|
/* Don't kill the thread, just put it in cache for reuse */
|
||||||
DBUG_PRINT("info", ("Adding thread to cache"));
|
DBUG_PRINT("info", ("Adding thread to cache"));
|
||||||
cached_thread_count++;
|
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)
|
while (!wake_thread)
|
||||||
{
|
{
|
||||||
int error= mysql_cond_timedwait(&COND_thread_cache, &LOCK_thread_cache,
|
int error= mysql_cond_timedwait(&COND_thread_cache, &LOCK_thread_cache,
|
||||||
@ -2712,35 +2711,7 @@ bool cache_thread(THD *thd)
|
|||||||
{
|
{
|
||||||
wake_thread--;
|
wake_thread--;
|
||||||
mysql_mutex_unlock(&LOCK_thread_cache);
|
mysql_mutex_unlock(&LOCK_thread_cache);
|
||||||
|
DBUG_RETURN(connect);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mysql_mutex_unlock(&LOCK_thread_cache);
|
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 handle_connection_in_main_thread(CONNECT *thd);
|
||||||
void create_thread_to_handle_connection(CONNECT *connect);
|
void create_thread_to_handle_connection(CONNECT *connect);
|
||||||
void unlink_thd(THD *thd);
|
void unlink_thd(THD *thd);
|
||||||
bool cache_thread(THD *thd);
|
CONNECT *cache_thread(THD *thd);
|
||||||
void flush_thread_cache();
|
void flush_thread_cache();
|
||||||
void refresh_status(THD *thd);
|
void refresh_status(THD *thd);
|
||||||
bool is_secure_file_path(char *path);
|
bool is_secure_file_path(char *path);
|
||||||
|
@ -1426,8 +1426,36 @@ end_thread:
|
|||||||
|
|
||||||
unlink_thd(thd);
|
unlink_thd(thd);
|
||||||
if (IF_WSREP(thd->wsrep_applier, false) || !put_in_cache ||
|
if (IF_WSREP(thd->wsrep_applier, false) || !put_in_cache ||
|
||||||
!cache_thread(thd))
|
!(connect= cache_thread(thd)))
|
||||||
break;
|
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;
|
delete thd;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user