summaryrefslogtreecommitdiff
path: root/libmysqld
diff options
context:
space:
mode:
authorVladislav Vaintroub <vvaintroub@mysql.com>2008-12-04 19:41:53 +0100
committerVladislav Vaintroub <vvaintroub@mysql.com>2008-12-04 19:41:53 +0100
commit8f500c522b5b38b55204031a90977c2c087ffd5c (patch)
treed7a8c4dab0b8f84158841d43c0809b985e9f07a9 /libmysqld
parent014143e8588c4313ccf10e269aa34a997f5772b6 (diff)
downloadmariadb-git-8f500c522b5b38b55204031a90977c2c087ffd5c.tar.gz
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()
Diffstat (limited to 'libmysqld')
-rw-r--r--libmysqld/examples/CMakeLists.txt6
-rw-r--r--libmysqld/lib_sql.cc8
-rw-r--r--libmysqld/libmysqld.def126
3 files changed, 5 insertions, 135 deletions
diff --git a/libmysqld/examples/CMakeLists.txt b/libmysqld/examples/CMakeLists.txt
index 137dd11d28e..346278425a7 100644
--- a/libmysqld/examples/CMakeLists.txt
+++ b/libmysqld/examples/CMakeLists.txt
@@ -29,13 +29,13 @@ ADD_DEFINITIONS(-DEMBEDDED_LIBRARY)
ADD_EXECUTABLE(mysql_embedded ../../client/completion_hash.cc
../../client/mysql.cc ../../client/readline.cc
../../client/sql_string.cc)
-TARGET_LINK_LIBRARIES(mysql_embedded wsock32)
+TARGET_LINK_LIBRARIES(mysql_embedded debug dbug strings mysys vio yassl taocrypt regex ws2_32)
ADD_DEPENDENCIES(mysql_embedded libmysqld)
ADD_EXECUTABLE(mysqltest_embedded ../../client/mysqltest.c)
-TARGET_LINK_LIBRARIES(mysqltest_embedded wsock32)
+TARGET_LINK_LIBRARIES(mysqltest_embedded debug dbug strings mysys vio yassl taocrypt regex ws2_32)
ADD_DEPENDENCIES(mysqltest_embedded libmysqld)
ADD_EXECUTABLE(mysql_client_test_embedded ../../tests/mysql_client_test.c)
-TARGET_LINK_LIBRARIES(mysql_client_test_embedded wsock32)
+TARGET_LINK_LIBRARIES(mysql_client_test_embedded debug dbug strings mysys vio yassl taocrypt regex ws2_32)
ADD_DEPENDENCIES(mysql_client_test_embedded libmysqld)
diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc
index e78c656d565..23572ad4929 100644
--- a/libmysqld/lib_sql.cc
+++ b/libmysqld/lib_sql.cc
@@ -386,6 +386,7 @@ static void emb_free_embedded_thd(MYSQL *mysql)
thd->store_globals();
thd->unlink();
delete thd;
+ my_pthread_setspecific_ptr(THR_THD, 0);
mysql->thd=0;
}
@@ -539,12 +540,7 @@ int init_embedded_server(int argc, char **argv, char **groups)
(void) thr_setconcurrency(concurrency); // 10 by default
- if (flush_time && flush_time != ~(ulong) 0L)
- {
- pthread_t hThread;
- if (pthread_create(&hThread,&connection_attrib,handle_manager,0))
- sql_print_error("Warning: Can't create thread to manage maintenance");
- }
+ start_handle_manager();
// FIXME initialize binlog_filter and rpl_filter if not already done
// corresponding delete is in clean_up()
diff --git a/libmysqld/libmysqld.def b/libmysqld/libmysqld.def
index 865475cb56c..047cfe0fe57 100644
--- a/libmysqld/libmysqld.def
+++ b/libmysqld/libmysqld.def
@@ -2,94 +2,6 @@ LIBRARY LIBMYSQLD
DESCRIPTION 'MySQL 5.1 Embedded Server Library'
VERSION 5.1
EXPORTS
- _db_process_
- _db_enter_
- _db_return_
- _db_push_
- _db_doprnt_
- _db_pargs_
- strnmov
- get_charset
- my_memmem
- my_snprintf
- pthread_exit
- pthread_cond_signal
- dynstr_append_mem
- init_dynamic_string
- dynstr_free
- my_hash_free
- my_vsnprintf
- dynstr_append
- my_close
- my_open
- dynstr_set
- dynstr_append_os_quoted
- my_delete
- my_seek
- my_write
- create_temp_file
- fn_format
- dirname_part
- my_hash_insert
- my_hash_search
- test_if_hard_path
- my_copy
- my_mkdir
- my_sleep
- my_strtod
- pthread_cond_wait
- my_strnncoll_simple
- get_dynamic
- my_regerror
- init_dynamic_array2
- pthread_create
- pthread_cond_init
- my_regcomp
- my_regexec
- my_regex_end
- my_regfree
- longlong2str
- my_set_exception_pointers
- my_print_stacktrace
- my_thread_stack_size
- my_safe_print_str
- my_stat
- _my_hash_init
- pthread_attr_setstacksize
- pthread_attr_init
- my_dirend
- wild_compare
- my_dir
- my_micro_time
- find_type_or_exit
- _dig_vec_upper
- _dig_vec_lower
- bmove_upp
- delete_dynamic
- free_defaults
- getopt_compare_strings
- getopt_ull_limit_value
- handle_options
- init_dynamic_array
- insert_dynamic
- int2str
- is_prefix
- list_add
- list_delete
- load_defaults
- max_allowed_packet
- my_cgets
- my_end
- my_getopt_print_errors
- my_init
- my_malloc
- my_memdup
- my_no_flags_free
- my_path
- my_print_help
- my_print_variables
- my_realloc
- my_strdup
mysql_thread_end
mysql_thread_init
myodbc_remove_escape
@@ -162,47 +74,13 @@ EXPORTS
mysql_thread_safe
mysql_use_result
mysql_warning_count
- set_dynamic
- strcend
- strcont
- strdup_root
- strfill
- strinstr
- strmake
- strmov
- strxmov
mysql_server_end
mysql_server_init
get_tty_password
- sql_protocol_typelib
mysql_get_server_version
mysql_set_character_set
mysql_sqlstate
- charsets_dir
- disabled_my_option
- my_charset_latin1
- init_alloc_root
- my_progname
- get_charset_name
- get_charset_by_csname
- print_defaults
- find_type
- strxnmov
- strend
- my_fopen
- my_fclose
- unpack_filename
- str2int
- int10_to_str
- longlong10_to_str
- my_snprintf_8bit
- alloc_root
- free_root
- my_read
- llstr
mysql_get_parameters
- mysql_thread_init
- mysql_thread_end
mysql_stmt_bind_param
mysql_stmt_bind_result
mysql_stmt_execute
@@ -230,7 +108,3 @@ EXPORTS
mysql_stmt_attr_get
mysql_stmt_attr_set
mysql_stmt_field_count
- get_defaults_options
- my_charset_bin
- my_charset_same
- modify_defaults_file