2014-01-06 06:22:35 +01:00
|
|
|
/* Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
|
2000-11-28 00:14:49 +01:00
|
|
|
|
|
|
|
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
|
2006-12-23 20:17:15 +01:00
|
|
|
the Free Software Foundation; version 2 of the License.
|
2000-11-28 00:14:49 +01:00
|
|
|
|
|
|
|
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
|
2019-05-11 20:29:06 +02:00
|
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
|
2000-11-28 00:14:49 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
* sql_manager.cc
|
|
|
|
* This thread manages various maintenance tasks.
|
|
|
|
*
|
|
|
|
* o Flushing the tables every flush_time seconds.
|
|
|
|
* o Berkeley DB: removing unneeded log files.
|
|
|
|
*/
|
|
|
|
|
2017-06-18 05:42:16 +02:00
|
|
|
#include "mariadb.h"
|
2010-03-31 16:05:33 +02:00
|
|
|
#include "sql_priv.h"
|
|
|
|
#include "sql_manager.h"
|
|
|
|
#include "sql_base.h" // flush_tables
|
Bug#38522: 5 seconds delay when closing application using embedded server
The problem here is that embedded server starts handle_thread manager
thread on mysql_library_init() does not stop it on mysql_library_end().
At shutdown, my_thread_global_end() waits for thread count to become 0,
but since we did not stop the thread it will give up after 5 seconds.
Solution is to move shutdown for handle_manager thread from kill_server()
(mysqld specific) to clean_up() that is used by both embedded and mysqld.
This patch also contains some refactorings - to avoid duplicate code,
start_handle_manager() and stop_handle_manager() functions are introduced.
Unused variables are eliminated. handle_manager does not rely on global
variable abort_loop anymore to stop (abort_loop is not set for embedded).
Note: Specifically on Windows and when using DBUG version of libmysqld,
the complete solution requires removing obsolete code my_thread_init()
from my_thread_var(). This has a side effect that a DBUG statement
after my_thread_end() can cause thread counter to be incremented, and
embedded will hang for some seconds. Or worse, my_thread_init() will
crash if critical sections have been deleted by the global cleanup
routine that runs in a different thread.
This patch also fixes and revert prior changes for Bug#38293
"Libmysqld crash in mysql_library_init if language file missing".
Root cause of the crash observed in Bug#38293 was bug in my_thread_init()
described above
client/mysql.cc:
sql_protocol_typelib is not exported from libmysqld
(does not make sense either)
thus excluded from embedded client
dbug/dbug.c:
revert changes for Bug#38293
include/my_dbug.h:
revert changes for Bug#38293
libmysql/libmysql.c:
Removed DBUG_POP call, because when called after my_end(), will access
THR_key_mysys that is already deleted. The result of pthread_get_specific
is not predictable in this case and hence DBUG_POP can crash.
libmysqld/examples/CMakeLists.txt:
Revert changes for Bug#38293.
libmysqld/lib_sql.cc:
code to start handle manager is factored out into
start_handle_manager() function
libmysqld/libmysqld.def:
Revert changes for Bug #38293
Remove excessive exports from libmysqld, export what API documents.
mysys/my_thr_init.c:
Remove windows-DLL-specific workaround for something (old code, no documentation for
what specifically). The problem is that even after my_thread_end() is finished,
DBUG statement can initiate my_thread_init(). This does not happen anywhere else and
should not happen on Windows either.
sql/mysql_priv.h:
- new functions start_handle_manager() and stop_handle_manager()
- move manager_thread_in_use variable to sql_manager.cc and made
it static
- remove manager_status, as it is unused
sql/mysqld.cc:
Code to start/stop handle_manager thread is factored out into start_handle_manager()
2008-12-04 19:41:53 +01:00
|
|
|
|
2021-01-18 18:01:17 +01:00
|
|
|
static bool volatile manager_thread_in_use = 0;
|
|
|
|
static bool abort_manager = false;
|
2000-11-28 00:14:49 +01:00
|
|
|
|
|
|
|
pthread_t manager_thread;
|
2010-01-07 06:42:07 +01:00
|
|
|
mysql_mutex_t LOCK_manager;
|
|
|
|
mysql_cond_t COND_manager;
|
2000-11-28 00:14:49 +01:00
|
|
|
|
2005-11-07 16:25:06 +01:00
|
|
|
struct handler_cb {
|
|
|
|
struct handler_cb *next;
|
2021-01-18 18:01:17 +01:00
|
|
|
void (*action)(void *);
|
|
|
|
void *data;
|
2005-11-07 16:25:06 +01:00
|
|
|
};
|
|
|
|
|
2021-01-18 18:01:17 +01:00
|
|
|
static struct handler_cb *cb_list; // protected by LOCK_manager
|
2005-11-07 16:25:06 +01:00
|
|
|
|
2021-01-18 18:01:17 +01:00
|
|
|
bool mysql_manager_submit(void (*action)(void *), void *data)
|
2005-11-07 16:25:06 +01:00
|
|
|
{
|
|
|
|
bool result= FALSE;
|
2012-01-02 23:52:31 +01:00
|
|
|
DBUG_ASSERT(manager_thread_in_use);
|
2021-01-18 18:01:17 +01:00
|
|
|
struct handler_cb **cb;
|
2010-01-07 06:42:07 +01:00
|
|
|
mysql_mutex_lock(&LOCK_manager);
|
2005-11-07 16:25:06 +01:00
|
|
|
cb= &cb_list;
|
2021-01-18 18:01:17 +01:00
|
|
|
while (*cb)
|
2005-11-07 16:25:06 +01:00
|
|
|
cb= &(*cb)->next;
|
2021-01-18 18:01:17 +01:00
|
|
|
*cb= (struct handler_cb *)my_malloc(sizeof(struct handler_cb), MYF(MY_WME));
|
2005-11-07 16:25:06 +01:00
|
|
|
if (!*cb)
|
2021-01-18 18:01:17 +01:00
|
|
|
result= TRUE;
|
|
|
|
else
|
2005-11-07 16:25:06 +01:00
|
|
|
{
|
2021-01-18 18:01:17 +01:00
|
|
|
(*cb)->next= NULL;
|
|
|
|
(*cb)->action= action;
|
|
|
|
(*cb)->data= data;
|
2005-11-07 16:25:06 +01:00
|
|
|
}
|
2021-01-18 18:01:17 +01:00
|
|
|
mysql_cond_signal(&COND_manager);
|
2010-01-07 06:42:07 +01:00
|
|
|
mysql_mutex_unlock(&LOCK_manager);
|
2005-11-07 16:25:06 +01:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2005-10-08 16:39:55 +02:00
|
|
|
pthread_handler_t handle_manager(void *arg __attribute__((unused)))
|
2000-11-28 00:14:49 +01:00
|
|
|
{
|
|
|
|
int error = 0;
|
|
|
|
struct timespec abstime;
|
|
|
|
bool reset_flush_time = TRUE;
|
|
|
|
my_thread_init();
|
|
|
|
DBUG_ENTER("handle_manager");
|
|
|
|
|
|
|
|
pthread_detach_this_thread();
|
|
|
|
manager_thread = pthread_self();
|
2021-01-18 18:01:17 +01:00
|
|
|
mysql_mutex_lock(&LOCK_manager);
|
|
|
|
while (!abort_manager)
|
2000-11-28 00:14:49 +01:00
|
|
|
{
|
|
|
|
/* XXX: This will need to be made more general to handle different
|
|
|
|
* polling needs. */
|
|
|
|
if (flush_time)
|
|
|
|
{
|
|
|
|
if (reset_flush_time)
|
|
|
|
{
|
2002-01-02 20:29:41 +01:00
|
|
|
set_timespec(abstime, flush_time);
|
2000-11-28 00:14:49 +01:00
|
|
|
reset_flush_time = FALSE;
|
|
|
|
}
|
2021-01-18 18:01:17 +01:00
|
|
|
while ((!error || error == EINTR) && !abort_manager && !cb_list)
|
2010-01-07 06:42:07 +01:00
|
|
|
error= mysql_cond_timedwait(&COND_manager, &LOCK_manager, &abstime);
|
2021-01-18 18:01:17 +01:00
|
|
|
|
|
|
|
if (error == ETIMEDOUT || error == ETIME)
|
|
|
|
{
|
|
|
|
tc_purge();
|
|
|
|
error = 0;
|
|
|
|
reset_flush_time = TRUE;
|
|
|
|
}
|
2000-11-28 00:14:49 +01:00
|
|
|
}
|
|
|
|
else
|
2005-10-11 23:58:22 +02:00
|
|
|
{
|
2021-01-18 18:01:17 +01:00
|
|
|
while ((!error || error == EINTR) && !abort_manager && !cb_list)
|
2010-01-07 06:42:07 +01:00
|
|
|
error= mysql_cond_wait(&COND_manager, &LOCK_manager);
|
2005-10-11 23:58:22 +02:00
|
|
|
}
|
2000-11-28 00:14:49 +01:00
|
|
|
|
2021-01-18 18:01:17 +01:00
|
|
|
struct handler_cb *cb= cb_list;
|
|
|
|
cb_list= NULL;
|
|
|
|
mysql_mutex_unlock(&LOCK_manager);
|
2000-11-28 00:14:49 +01:00
|
|
|
|
2005-11-07 16:25:06 +01:00
|
|
|
while (cb)
|
2000-11-28 00:14:49 +01:00
|
|
|
{
|
2005-11-07 16:25:06 +01:00
|
|
|
struct handler_cb *next= cb->next;
|
2021-01-18 18:01:17 +01:00
|
|
|
cb->action(cb->data);
|
Bug#34043: Server loops excessively in _checkchunk() when safemalloc is enabled
Essentially, the problem is that safemalloc is excruciatingly
slow as it checks all allocated blocks for overrun at each
memory management primitive, yielding a almost exponential
slowdown for the memory management functions (malloc, realloc,
free). The overrun check basically consists of verifying some
bytes of a block for certain magic keys, which catches some
simple forms of overrun. Another minor problem is violation
of aliasing rules and that its own internal list of blocks
is prone to corruption.
Another issue with safemalloc is rather the maintenance cost
as the tool has a significant impact on the server code.
Given the magnitude of memory debuggers available nowadays,
especially those that are provided with the platform malloc
implementation, maintenance of a in-house and largely obsolete
memory debugger becomes a burden that is not worth the effort
due to its slowness and lack of support for detecting more
common forms of heap corruption.
Since there are third-party tools that can provide the same
functionality at a lower or comparable performance cost, the
solution is to simply remove safemalloc. Third-party tools
can provide the same functionality at a lower or comparable
performance cost.
The removal of safemalloc also allows a simplification of the
malloc wrappers, removing quite a bit of kludge: redefinition
of my_malloc, my_free and the removal of the unused second
argument of my_free. Since free() always check whether the
supplied pointer is null, redudant checks are also removed.
Also, this patch adds unit testing for my_malloc and moves
my_realloc implementation into the same file as the other
memory allocation primitives.
client/mysqldump.c:
Pass my_free directly as its signature is compatible with the
callback type -- which wasn't the case for free_table_ent.
2010-07-08 23:20:08 +02:00
|
|
|
my_free(cb);
|
2005-11-07 16:25:06 +01:00
|
|
|
cb= next;
|
2000-11-28 00:14:49 +01:00
|
|
|
}
|
2021-01-18 18:01:17 +01:00
|
|
|
mysql_mutex_lock(&LOCK_manager);
|
2000-11-28 00:14:49 +01:00
|
|
|
}
|
|
|
|
manager_thread_in_use = 0;
|
2021-01-18 18:01:17 +01:00
|
|
|
mysql_mutex_unlock(&LOCK_manager);
|
2012-02-15 18:08:08 +01:00
|
|
|
mysql_mutex_destroy(&LOCK_manager);
|
|
|
|
mysql_cond_destroy(&COND_manager);
|
Bug#38522: 5 seconds delay when closing application using embedded server
The problem here is that embedded server starts handle_thread manager
thread on mysql_library_init() does not stop it on mysql_library_end().
At shutdown, my_thread_global_end() waits for thread count to become 0,
but since we did not stop the thread it will give up after 5 seconds.
Solution is to move shutdown for handle_manager thread from kill_server()
(mysqld specific) to clean_up() that is used by both embedded and mysqld.
This patch also contains some refactorings - to avoid duplicate code,
start_handle_manager() and stop_handle_manager() functions are introduced.
Unused variables are eliminated. handle_manager does not rely on global
variable abort_loop anymore to stop (abort_loop is not set for embedded).
Note: Specifically on Windows and when using DBUG version of libmysqld,
the complete solution requires removing obsolete code my_thread_init()
from my_thread_var(). This has a side effect that a DBUG statement
after my_thread_end() can cause thread counter to be incremented, and
embedded will hang for some seconds. Or worse, my_thread_init() will
crash if critical sections have been deleted by the global cleanup
routine that runs in a different thread.
This patch also fixes and revert prior changes for Bug#38293
"Libmysqld crash in mysql_library_init if language file missing".
Root cause of the crash observed in Bug#38293 was bug in my_thread_init()
described above
client/mysql.cc:
sql_protocol_typelib is not exported from libmysqld
(does not make sense either)
thus excluded from embedded client
dbug/dbug.c:
revert changes for Bug#38293
include/my_dbug.h:
revert changes for Bug#38293
libmysql/libmysql.c:
Removed DBUG_POP call, because when called after my_end(), will access
THR_key_mysys that is already deleted. The result of pthread_get_specific
is not predictable in this case and hence DBUG_POP can crash.
libmysqld/examples/CMakeLists.txt:
Revert changes for Bug#38293.
libmysqld/lib_sql.cc:
code to start handle manager is factored out into
start_handle_manager() function
libmysqld/libmysqld.def:
Revert changes for Bug #38293
Remove excessive exports from libmysqld, export what API documents.
mysys/my_thr_init.c:
Remove windows-DLL-specific workaround for something (old code, no documentation for
what specifically). The problem is that even after my_thread_end() is finished,
DBUG statement can initiate my_thread_init(). This does not happen anywhere else and
should not happen on Windows either.
sql/mysql_priv.h:
- new functions start_handle_manager() and stop_handle_manager()
- move manager_thread_in_use variable to sql_manager.cc and made
it static
- remove manager_status, as it is unused
sql/mysqld.cc:
Code to start/stop handle_manager thread is factored out into start_handle_manager()
2008-12-04 19:41:53 +01:00
|
|
|
DBUG_LEAVE; // Can't use DBUG_RETURN after my_thread_end
|
2000-11-28 00:14:49 +01:00
|
|
|
my_thread_end();
|
Bug#38522: 5 seconds delay when closing application using embedded server
The problem here is that embedded server starts handle_thread manager
thread on mysql_library_init() does not stop it on mysql_library_end().
At shutdown, my_thread_global_end() waits for thread count to become 0,
but since we did not stop the thread it will give up after 5 seconds.
Solution is to move shutdown for handle_manager thread from kill_server()
(mysqld specific) to clean_up() that is used by both embedded and mysqld.
This patch also contains some refactorings - to avoid duplicate code,
start_handle_manager() and stop_handle_manager() functions are introduced.
Unused variables are eliminated. handle_manager does not rely on global
variable abort_loop anymore to stop (abort_loop is not set for embedded).
Note: Specifically on Windows and when using DBUG version of libmysqld,
the complete solution requires removing obsolete code my_thread_init()
from my_thread_var(). This has a side effect that a DBUG statement
after my_thread_end() can cause thread counter to be incremented, and
embedded will hang for some seconds. Or worse, my_thread_init() will
crash if critical sections have been deleted by the global cleanup
routine that runs in a different thread.
This patch also fixes and revert prior changes for Bug#38293
"Libmysqld crash in mysql_library_init if language file missing".
Root cause of the crash observed in Bug#38293 was bug in my_thread_init()
described above
client/mysql.cc:
sql_protocol_typelib is not exported from libmysqld
(does not make sense either)
thus excluded from embedded client
dbug/dbug.c:
revert changes for Bug#38293
include/my_dbug.h:
revert changes for Bug#38293
libmysql/libmysql.c:
Removed DBUG_POP call, because when called after my_end(), will access
THR_key_mysys that is already deleted. The result of pthread_get_specific
is not predictable in this case and hence DBUG_POP can crash.
libmysqld/examples/CMakeLists.txt:
Revert changes for Bug#38293.
libmysqld/lib_sql.cc:
code to start handle manager is factored out into
start_handle_manager() function
libmysqld/libmysqld.def:
Revert changes for Bug #38293
Remove excessive exports from libmysqld, export what API documents.
mysys/my_thr_init.c:
Remove windows-DLL-specific workaround for something (old code, no documentation for
what specifically). The problem is that even after my_thread_end() is finished,
DBUG statement can initiate my_thread_init(). This does not happen anywhere else and
should not happen on Windows either.
sql/mysql_priv.h:
- new functions start_handle_manager() and stop_handle_manager()
- move manager_thread_in_use variable to sql_manager.cc and made
it static
- remove manager_status, as it is unused
sql/mysqld.cc:
Code to start/stop handle_manager thread is factored out into start_handle_manager()
2008-12-04 19:41:53 +01:00
|
|
|
return (NULL);
|
2000-11-28 00:14:49 +01:00
|
|
|
}
|
Bug#38522: 5 seconds delay when closing application using embedded server
The problem here is that embedded server starts handle_thread manager
thread on mysql_library_init() does not stop it on mysql_library_end().
At shutdown, my_thread_global_end() waits for thread count to become 0,
but since we did not stop the thread it will give up after 5 seconds.
Solution is to move shutdown for handle_manager thread from kill_server()
(mysqld specific) to clean_up() that is used by both embedded and mysqld.
This patch also contains some refactorings - to avoid duplicate code,
start_handle_manager() and stop_handle_manager() functions are introduced.
Unused variables are eliminated. handle_manager does not rely on global
variable abort_loop anymore to stop (abort_loop is not set for embedded).
Note: Specifically on Windows and when using DBUG version of libmysqld,
the complete solution requires removing obsolete code my_thread_init()
from my_thread_var(). This has a side effect that a DBUG statement
after my_thread_end() can cause thread counter to be incremented, and
embedded will hang for some seconds. Or worse, my_thread_init() will
crash if critical sections have been deleted by the global cleanup
routine that runs in a different thread.
This patch also fixes and revert prior changes for Bug#38293
"Libmysqld crash in mysql_library_init if language file missing".
Root cause of the crash observed in Bug#38293 was bug in my_thread_init()
described above
client/mysql.cc:
sql_protocol_typelib is not exported from libmysqld
(does not make sense either)
thus excluded from embedded client
dbug/dbug.c:
revert changes for Bug#38293
include/my_dbug.h:
revert changes for Bug#38293
libmysql/libmysql.c:
Removed DBUG_POP call, because when called after my_end(), will access
THR_key_mysys that is already deleted. The result of pthread_get_specific
is not predictable in this case and hence DBUG_POP can crash.
libmysqld/examples/CMakeLists.txt:
Revert changes for Bug#38293.
libmysqld/lib_sql.cc:
code to start handle manager is factored out into
start_handle_manager() function
libmysqld/libmysqld.def:
Revert changes for Bug #38293
Remove excessive exports from libmysqld, export what API documents.
mysys/my_thr_init.c:
Remove windows-DLL-specific workaround for something (old code, no documentation for
what specifically). The problem is that even after my_thread_end() is finished,
DBUG statement can initiate my_thread_init(). This does not happen anywhere else and
should not happen on Windows either.
sql/mysql_priv.h:
- new functions start_handle_manager() and stop_handle_manager()
- move manager_thread_in_use variable to sql_manager.cc and made
it static
- remove manager_status, as it is unused
sql/mysqld.cc:
Code to start/stop handle_manager thread is factored out into start_handle_manager()
2008-12-04 19:41:53 +01:00
|
|
|
|
|
|
|
|
|
|
|
/* Start handle manager thread */
|
|
|
|
void start_handle_manager()
|
|
|
|
{
|
|
|
|
DBUG_ENTER("start_handle_manager");
|
|
|
|
abort_manager = false;
|
|
|
|
{
|
|
|
|
pthread_t hThread;
|
2021-01-18 18:01:17 +01:00
|
|
|
int err;
|
2022-04-13 20:45:50 +02:00
|
|
|
DBUG_EXECUTE_IF("delay_start_handle_manager", my_sleep(1000););
|
2021-01-18 18:01:17 +01:00
|
|
|
manager_thread_in_use = 1;
|
|
|
|
mysql_cond_init(key_COND_manager, &COND_manager,NULL);
|
|
|
|
mysql_mutex_init(key_LOCK_manager, &LOCK_manager, NULL);
|
|
|
|
if ((err= mysql_thread_create(key_thread_handle_manager, &hThread,
|
|
|
|
&connection_attrib, handle_manager, 0)))
|
|
|
|
sql_print_warning("Can't create handle_manager thread (errno: %M)", err);
|
Bug#38522: 5 seconds delay when closing application using embedded server
The problem here is that embedded server starts handle_thread manager
thread on mysql_library_init() does not stop it on mysql_library_end().
At shutdown, my_thread_global_end() waits for thread count to become 0,
but since we did not stop the thread it will give up after 5 seconds.
Solution is to move shutdown for handle_manager thread from kill_server()
(mysqld specific) to clean_up() that is used by both embedded and mysqld.
This patch also contains some refactorings - to avoid duplicate code,
start_handle_manager() and stop_handle_manager() functions are introduced.
Unused variables are eliminated. handle_manager does not rely on global
variable abort_loop anymore to stop (abort_loop is not set for embedded).
Note: Specifically on Windows and when using DBUG version of libmysqld,
the complete solution requires removing obsolete code my_thread_init()
from my_thread_var(). This has a side effect that a DBUG statement
after my_thread_end() can cause thread counter to be incremented, and
embedded will hang for some seconds. Or worse, my_thread_init() will
crash if critical sections have been deleted by the global cleanup
routine that runs in a different thread.
This patch also fixes and revert prior changes for Bug#38293
"Libmysqld crash in mysql_library_init if language file missing".
Root cause of the crash observed in Bug#38293 was bug in my_thread_init()
described above
client/mysql.cc:
sql_protocol_typelib is not exported from libmysqld
(does not make sense either)
thus excluded from embedded client
dbug/dbug.c:
revert changes for Bug#38293
include/my_dbug.h:
revert changes for Bug#38293
libmysql/libmysql.c:
Removed DBUG_POP call, because when called after my_end(), will access
THR_key_mysys that is already deleted. The result of pthread_get_specific
is not predictable in this case and hence DBUG_POP can crash.
libmysqld/examples/CMakeLists.txt:
Revert changes for Bug#38293.
libmysqld/lib_sql.cc:
code to start handle manager is factored out into
start_handle_manager() function
libmysqld/libmysqld.def:
Revert changes for Bug #38293
Remove excessive exports from libmysqld, export what API documents.
mysys/my_thr_init.c:
Remove windows-DLL-specific workaround for something (old code, no documentation for
what specifically). The problem is that even after my_thread_end() is finished,
DBUG statement can initiate my_thread_init(). This does not happen anywhere else and
should not happen on Windows either.
sql/mysql_priv.h:
- new functions start_handle_manager() and stop_handle_manager()
- move manager_thread_in_use variable to sql_manager.cc and made
it static
- remove manager_status, as it is unused
sql/mysqld.cc:
Code to start/stop handle_manager thread is factored out into start_handle_manager()
2008-12-04 19:41:53 +01:00
|
|
|
}
|
|
|
|
DBUG_VOID_RETURN;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Initiate shutdown of handle manager thread */
|
|
|
|
void stop_handle_manager()
|
|
|
|
{
|
|
|
|
DBUG_ENTER("stop_handle_manager");
|
|
|
|
if (manager_thread_in_use)
|
|
|
|
{
|
2012-02-15 18:08:08 +01:00
|
|
|
mysql_mutex_lock(&LOCK_manager);
|
2021-01-18 18:01:17 +01:00
|
|
|
abort_manager = true;
|
2017-09-19 19:45:17 +02:00
|
|
|
DBUG_PRINT("quit", ("initiate shutdown of handle manager thread: %lu",
|
Bug#38522: 5 seconds delay when closing application using embedded server
The problem here is that embedded server starts handle_thread manager
thread on mysql_library_init() does not stop it on mysql_library_end().
At shutdown, my_thread_global_end() waits for thread count to become 0,
but since we did not stop the thread it will give up after 5 seconds.
Solution is to move shutdown for handle_manager thread from kill_server()
(mysqld specific) to clean_up() that is used by both embedded and mysqld.
This patch also contains some refactorings - to avoid duplicate code,
start_handle_manager() and stop_handle_manager() functions are introduced.
Unused variables are eliminated. handle_manager does not rely on global
variable abort_loop anymore to stop (abort_loop is not set for embedded).
Note: Specifically on Windows and when using DBUG version of libmysqld,
the complete solution requires removing obsolete code my_thread_init()
from my_thread_var(). This has a side effect that a DBUG statement
after my_thread_end() can cause thread counter to be incremented, and
embedded will hang for some seconds. Or worse, my_thread_init() will
crash if critical sections have been deleted by the global cleanup
routine that runs in a different thread.
This patch also fixes and revert prior changes for Bug#38293
"Libmysqld crash in mysql_library_init if language file missing".
Root cause of the crash observed in Bug#38293 was bug in my_thread_init()
described above
client/mysql.cc:
sql_protocol_typelib is not exported from libmysqld
(does not make sense either)
thus excluded from embedded client
dbug/dbug.c:
revert changes for Bug#38293
include/my_dbug.h:
revert changes for Bug#38293
libmysql/libmysql.c:
Removed DBUG_POP call, because when called after my_end(), will access
THR_key_mysys that is already deleted. The result of pthread_get_specific
is not predictable in this case and hence DBUG_POP can crash.
libmysqld/examples/CMakeLists.txt:
Revert changes for Bug#38293.
libmysqld/lib_sql.cc:
code to start handle manager is factored out into
start_handle_manager() function
libmysqld/libmysqld.def:
Revert changes for Bug #38293
Remove excessive exports from libmysqld, export what API documents.
mysys/my_thr_init.c:
Remove windows-DLL-specific workaround for something (old code, no documentation for
what specifically). The problem is that even after my_thread_end() is finished,
DBUG statement can initiate my_thread_init(). This does not happen anywhere else and
should not happen on Windows either.
sql/mysql_priv.h:
- new functions start_handle_manager() and stop_handle_manager()
- move manager_thread_in_use variable to sql_manager.cc and made
it static
- remove manager_status, as it is unused
sql/mysqld.cc:
Code to start/stop handle_manager thread is factored out into start_handle_manager()
2008-12-04 19:41:53 +01:00
|
|
|
(ulong)manager_thread));
|
2010-01-07 06:42:07 +01:00
|
|
|
mysql_cond_signal(&COND_manager);
|
2012-02-15 18:08:08 +01:00
|
|
|
mysql_mutex_unlock(&LOCK_manager);
|
Bug#38522: 5 seconds delay when closing application using embedded server
The problem here is that embedded server starts handle_thread manager
thread on mysql_library_init() does not stop it on mysql_library_end().
At shutdown, my_thread_global_end() waits for thread count to become 0,
but since we did not stop the thread it will give up after 5 seconds.
Solution is to move shutdown for handle_manager thread from kill_server()
(mysqld specific) to clean_up() that is used by both embedded and mysqld.
This patch also contains some refactorings - to avoid duplicate code,
start_handle_manager() and stop_handle_manager() functions are introduced.
Unused variables are eliminated. handle_manager does not rely on global
variable abort_loop anymore to stop (abort_loop is not set for embedded).
Note: Specifically on Windows and when using DBUG version of libmysqld,
the complete solution requires removing obsolete code my_thread_init()
from my_thread_var(). This has a side effect that a DBUG statement
after my_thread_end() can cause thread counter to be incremented, and
embedded will hang for some seconds. Or worse, my_thread_init() will
crash if critical sections have been deleted by the global cleanup
routine that runs in a different thread.
This patch also fixes and revert prior changes for Bug#38293
"Libmysqld crash in mysql_library_init if language file missing".
Root cause of the crash observed in Bug#38293 was bug in my_thread_init()
described above
client/mysql.cc:
sql_protocol_typelib is not exported from libmysqld
(does not make sense either)
thus excluded from embedded client
dbug/dbug.c:
revert changes for Bug#38293
include/my_dbug.h:
revert changes for Bug#38293
libmysql/libmysql.c:
Removed DBUG_POP call, because when called after my_end(), will access
THR_key_mysys that is already deleted. The result of pthread_get_specific
is not predictable in this case and hence DBUG_POP can crash.
libmysqld/examples/CMakeLists.txt:
Revert changes for Bug#38293.
libmysqld/lib_sql.cc:
code to start handle manager is factored out into
start_handle_manager() function
libmysqld/libmysqld.def:
Revert changes for Bug #38293
Remove excessive exports from libmysqld, export what API documents.
mysys/my_thr_init.c:
Remove windows-DLL-specific workaround for something (old code, no documentation for
what specifically). The problem is that even after my_thread_end() is finished,
DBUG statement can initiate my_thread_init(). This does not happen anywhere else and
should not happen on Windows either.
sql/mysql_priv.h:
- new functions start_handle_manager() and stop_handle_manager()
- move manager_thread_in_use variable to sql_manager.cc and made
it static
- remove manager_status, as it is unused
sql/mysqld.cc:
Code to start/stop handle_manager thread is factored out into start_handle_manager()
2008-12-04 19:41:53 +01:00
|
|
|
}
|
|
|
|
DBUG_VOID_RETURN;
|
|
|
|
}
|
|
|
|
|