Commit 8f329e8d authored by Vladislav Vaintroub's avatar Vladislav Vaintroub

MDEV-10384 Windows : Refactor threading in mysqld startup.

Remove threads that are doing nothing but wait
- main thread now handles the connections
(if threadpool is used, also threadpool threads would wait for connections)
- thread for socket and pipe connections are removed
- shutdown thread is now removed, we wait for shutdown
notification in main thread as well
- kill_server() is also called inside the main thread, after connection
loop finished.
parent 25ad38ab
...@@ -152,6 +152,7 @@ IF (CMAKE_SYSTEM_NAME MATCHES "Linux" OR ...@@ -152,6 +152,7 @@ IF (CMAKE_SYSTEM_NAME MATCHES "Linux" OR
ADD_DEFINITIONS(-DHAVE_POOL_OF_THREADS) ADD_DEFINITIONS(-DHAVE_POOL_OF_THREADS)
IF(WIN32) IF(WIN32)
SET(SQL_SOURCE ${SQL_SOURCE} threadpool_win.cc) SET(SQL_SOURCE ${SQL_SOURCE} threadpool_win.cc)
SET(SQL_SOURCE ${SQL_SOURCE} handle_connections_win.cc)
ENDIF() ENDIF()
SET(SQL_SOURCE ${SQL_SOURCE} threadpool_generic.cc) SET(SQL_SOURCE ${SQL_SOURCE} threadpool_generic.cc)
......
This diff is collapsed.
/* Copyright (c) 2018 MariaDB Corporation.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */
/**
Handles incoming socket and pipe connections, on Windows.
Creates new (THD) connections..
*/
extern void handle_connections_win();
...@@ -17,6 +17,6 @@ ...@@ -17,6 +17,6 @@
#define INIT_INCLUDED #define INIT_INCLUDED
void unireg_init(ulong options); void unireg_init(ulong options);
ATTRIBUTE_NORETURN void unireg_end(void); void unireg_end(void);
#endif /* INIT_INCLUDED */ #endif /* INIT_INCLUDED */
This diff is collapsed.
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "mysql_com.h" /* SERVER_VERSION_LENGTH */ #include "mysql_com.h" /* SERVER_VERSION_LENGTH */
#include "my_atomic.h" #include "my_atomic.h"
#include "mysql/psi/mysql_file.h" /* MYSQL_FILE */ #include "mysql/psi/mysql_file.h" /* MYSQL_FILE */
#include "mysql/psi/mysql_socket.h" /* MYSQL_SOCKET */
#include "sql_list.h" /* I_List */ #include "sql_list.h" /* I_List */
#include "sql_cmd.h" #include "sql_cmd.h"
#include <my_rnd.h> #include <my_rnd.h>
...@@ -92,6 +93,8 @@ void refresh_status(THD *thd); ...@@ -92,6 +93,8 @@ void refresh_status(THD *thd);
bool is_secure_file_path(char *path); bool is_secure_file_path(char *path);
void dec_connection_count(scheduler_functions *scheduler); void dec_connection_count(scheduler_functions *scheduler);
extern void init_net_server_extension(THD *thd); extern void init_net_server_extension(THD *thd);
extern void handle_accepted_socket(MYSQL_SOCKET new_sock, MYSQL_SOCKET sock);
extern void create_new_thread(CONNECT *connect);
extern "C" MYSQL_PLUGIN_IMPORT CHARSET_INFO *system_charset_info; extern "C" MYSQL_PLUGIN_IMPORT CHARSET_INFO *system_charset_info;
extern MYSQL_PLUGIN_IMPORT CHARSET_INFO *files_charset_info ; extern MYSQL_PLUGIN_IMPORT CHARSET_INFO *files_charset_info ;
...@@ -152,6 +155,7 @@ extern ulong opt_replicate_events_marked_for_skip; ...@@ -152,6 +155,7 @@ extern ulong opt_replicate_events_marked_for_skip;
extern char *default_tz_name; extern char *default_tz_name;
extern Time_zone *default_tz; extern Time_zone *default_tz;
extern char *my_bind_addr_str; extern char *my_bind_addr_str;
extern int server_socket_ai_family;
extern char *default_storage_engine, *default_tmp_storage_engine; extern char *default_storage_engine, *default_tmp_storage_engine;
extern char *enforced_storage_engine; extern char *enforced_storage_engine;
extern char *gtid_pos_auto_engines; extern char *gtid_pos_auto_engines;
...@@ -759,7 +763,7 @@ enum enum_query_type ...@@ -759,7 +763,7 @@ enum enum_query_type
/* query_id */ /* query_id */
extern query_id_t global_query_id; extern query_id_t global_query_id;
ATTRIBUTE_NORETURN void unireg_end(void); void unireg_end(void);
/* increment query_id and return it. */ /* increment query_id and return it. */
inline __attribute__((warn_unused_result)) query_id_t next_query_id() inline __attribute__((warn_unused_result)) query_id_t next_query_id()
......
...@@ -70,6 +70,11 @@ static DWORD fls; ...@@ -70,6 +70,11 @@ static DWORD fls;
static bool skip_completion_port_on_success = false; static bool skip_completion_port_on_success = false;
PTP_CALLBACK_ENVIRON get_threadpool_win_callback_environ()
{
return pool? &callback_environ: 0;
}
/* /*
Threadpool callbacks. Threadpool callbacks.
...@@ -134,7 +139,15 @@ struct TP_connection *new_TP_connection(CONNECT *connect) ...@@ -134,7 +139,15 @@ struct TP_connection *new_TP_connection(CONNECT *connect)
void TP_pool_win::add(TP_connection *c) void TP_pool_win::add(TP_connection *c)
{ {
SubmitThreadpoolWork(((TP_connection_win *)c)->work); if(FlsGetValue(fls))
{
/* Inside threadpool(), execute callback directly. */
tp_callback(c);
}
else
{
SubmitThreadpoolWork(((TP_connection_win *)c)->work);
}
} }
...@@ -288,14 +301,13 @@ TP_connection_win::~TP_connection_win() ...@@ -288,14 +301,13 @@ TP_connection_win::~TP_connection_win()
void TP_connection_win::wait_begin(int type) void TP_connection_win::wait_begin(int type)
{ {
/* /*
Signal to the threadpool whenever callback can run long. Currently, binlog Signal to the threadpool whenever callback can run long. Currently, binlog
waits are a good candidate, its waits are really long waits are a good candidate, its waits are really long
*/ */
if (type == THD_WAIT_BINLOG) if (type == THD_WAIT_BINLOG)
{ {
if (!long_callback) if (!long_callback && callback_instance)
{ {
CallbackMayRunLong(callback_instance); CallbackMayRunLong(callback_instance);
long_callback= true; long_callback= true;
...@@ -308,12 +320,11 @@ void TP_connection_win::wait_end() ...@@ -308,12 +320,11 @@ void TP_connection_win::wait_end()
/* Do we need to do anything ? */ /* Do we need to do anything ? */
} }
/* /*
This function should be called first whenever a callback is invoked in the This function should be called first whenever a callback is invoked in the
threadpool, does my_thread_init() if not yet done threadpool, does my_thread_init() if not yet done
*/ */
extern ulong thread_created; void tp_win_callback_prolog()
static void pre_callback(PVOID context, PTP_CALLBACK_INSTANCE instance)
{ {
if (FlsGetValue(fls) == NULL) if (FlsGetValue(fls) == NULL)
{ {
...@@ -323,6 +334,12 @@ static void pre_callback(PVOID context, PTP_CALLBACK_INSTANCE instance) ...@@ -323,6 +334,12 @@ static void pre_callback(PVOID context, PTP_CALLBACK_INSTANCE instance)
InterlockedIncrement((volatile long *)&tp_stats.num_worker_threads); InterlockedIncrement((volatile long *)&tp_stats.num_worker_threads);
my_thread_init(); my_thread_init();
} }
}
extern ulong thread_created;
static void pre_callback(PVOID context, PTP_CALLBACK_INSTANCE instance)
{
tp_win_callback_prolog();
TP_connection_win *c = (TP_connection_win *)context; TP_connection_win *c = (TP_connection_win *)context;
c->callback_instance = instance; c->callback_instance = instance;
c->long_callback = false; c->long_callback = false;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment