mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
WL#5363: Thread Pool Service Interface
In order to allow thread schedulers to be dynamically loaded, it is necessary to make the following changes to the server: - Two new service interfaces - Modifications to InnoDB to inform the thread scheduler of state changes. - Changes to the VIO subsystem for checking if data is available on a socket. - Elimination of remains of the old thread pool implementation. The two new service interfaces introduces are: my_thread_scheduler A service interface to register a thread scheduler. thd_wait A service interface to inform thread scheduler that the thread is about to start waiting. In addition, the patch adds code that: - Add a call to thd_wait for table locks in mysys thd_lock.c by introducing a set function that can be used to set a callback to be used when waiting on a lock and resuming from waiting. - Calling the mysys set function from the server to set the callbacks correctly.
This commit is contained in:
@@ -58,6 +58,7 @@
|
||||
#include "transaction.h"
|
||||
#include "debug_sync.h"
|
||||
#include "sql_parse.h" // is_update_query
|
||||
#include "sql_callback.h"
|
||||
|
||||
/*
|
||||
The following is used to initialise Table_ident with a internal
|
||||
@@ -1055,6 +1056,7 @@ THD::~THD()
|
||||
DBUG_ENTER("~THD()");
|
||||
/* Ensure that no one is using THD */
|
||||
mysql_mutex_lock(&LOCK_thd_data);
|
||||
mysys_var=0; // Safety (shouldn't be needed)
|
||||
mysql_mutex_unlock(&LOCK_thd_data);
|
||||
add_to_status(&global_status_var, &status_var);
|
||||
|
||||
@@ -1080,7 +1082,6 @@ THD::~THD()
|
||||
main_security_ctx.destroy();
|
||||
safeFree(db);
|
||||
free_root(&transaction.mem_root,MYF(0));
|
||||
mysys_var=0; // Safety (shouldn't be needed)
|
||||
mysql_mutex_destroy(&LOCK_thd_data);
|
||||
#ifndef DBUG_OFF
|
||||
dbug_sentry= THD_SENTRY_GONE;
|
||||
@@ -1163,7 +1164,7 @@ void THD::awake(THD::killed_state state_to_set)
|
||||
{
|
||||
thr_alarm_kill(thread_id);
|
||||
if (!slave_thread)
|
||||
thread_scheduler.post_kill_notification(this);
|
||||
MYSQL_CALLBACK(thread_scheduler, post_kill_notification, (this));
|
||||
#ifdef SIGNAL_WITH_VIO_CLOSE
|
||||
if (this != current_thd)
|
||||
{
|
||||
@@ -1232,6 +1233,15 @@ bool THD::store_globals()
|
||||
if (my_pthread_setspecific_ptr(THR_THD, this) ||
|
||||
my_pthread_setspecific_ptr(THR_MALLOC, &mem_root))
|
||||
return 1;
|
||||
/*
|
||||
mysys_var is concurrently readable by a killer thread.
|
||||
It is protected by LOCK_thd_data, it is not needed to lock while the
|
||||
pointer is changing from NULL not non-NULL. If the kill thread reads
|
||||
NULL it doesn't refer to anything, but if it is non-NULL we need to
|
||||
ensure that the thread doesn't proceed to assign another thread to
|
||||
have the mysys_var reference (which in fact refers to the worker
|
||||
threads local storage with key THR_KEY_mysys.
|
||||
*/
|
||||
mysys_var=my_thread_var;
|
||||
/*
|
||||
Let mysqld define the thread id (not mysys)
|
||||
@@ -3145,6 +3155,60 @@ extern "C" bool thd_binlog_filter_ok(const MYSQL_THD thd)
|
||||
{
|
||||
return binlog_filter->db_ok(thd->db);
|
||||
}
|
||||
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
extern "C" void thd_pool_wait_begin(MYSQL_THD thd, int wait_type);
|
||||
extern "C" void thd_pool_wait_end(MYSQL_THD thd);
|
||||
|
||||
/*
|
||||
Interface for MySQL Server, plugins and storage engines to report
|
||||
when they are going to sleep/stall.
|
||||
|
||||
SYNOPSIS
|
||||
thd_wait_begin()
|
||||
thd Thread object
|
||||
wait_type Type of wait
|
||||
1 -- short wait (e.g. for mutex)
|
||||
2 -- medium wait (e.g. for disk io)
|
||||
3 -- large wait (e.g. for locked row/table)
|
||||
NOTES
|
||||
This is used by the threadpool to have better knowledge of which
|
||||
threads that currently are actively running on CPUs. When a thread
|
||||
reports that it's going to sleep/stall, the threadpool scheduler is
|
||||
free to start another thread in the pool most likely. The expected wait
|
||||
time is simply an indication of how long the wait is expected to
|
||||
become, the real wait time could be very different.
|
||||
|
||||
thd_wait_end MUST be called immediately after waking up again.
|
||||
*/
|
||||
extern "C" void thd_wait_begin(MYSQL_THD thd, thd_wait_type wait_type)
|
||||
{
|
||||
MYSQL_CALLBACK(thread_scheduler, thd_wait_begin, (thd, wait_type));
|
||||
}
|
||||
|
||||
/**
|
||||
Interface for MySQL Server, plugins and storage engines to report
|
||||
when they waking up from a sleep/stall.
|
||||
|
||||
@param thd Thread handle
|
||||
*/
|
||||
extern "C" void thd_wait_end(MYSQL_THD thd)
|
||||
{
|
||||
MYSQL_CALLBACK(thread_scheduler, thd_wait_end, (thd));
|
||||
}
|
||||
#else
|
||||
extern "C" void thd_wait_begin(MYSQL_THD thd, thd_wait_type wait_type)
|
||||
{
|
||||
/* do NOTHING for the embedded library */
|
||||
return;
|
||||
}
|
||||
|
||||
extern "C" void thd_wait_end(MYSQL_THD thd)
|
||||
{
|
||||
/* do NOTHING for the embedded library */
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
#endif // INNODB_COMPATIBILITY_HOOKS */
|
||||
|
||||
/****************************************************************************
|
||||
@@ -3324,6 +3388,13 @@ void THD::set_query_id(query_id_t new_query_id)
|
||||
mysql_mutex_unlock(&LOCK_thd_data);
|
||||
}
|
||||
|
||||
/** Assign a new value to thd->mysys_var. */
|
||||
void THD::set_mysys_var(struct st_my_thread_var *new_mysys_var)
|
||||
{
|
||||
mysql_mutex_lock(&LOCK_thd_data);
|
||||
mysys_var= new_mysys_var;
|
||||
mysql_mutex_unlock(&LOCK_thd_data);
|
||||
}
|
||||
|
||||
/**
|
||||
Leave explicit LOCK TABLES or prelocked mode and restore value of
|
||||
|
Reference in New Issue
Block a user