Commit 4dfbf2ec authored by Vladislav Vaintroub's avatar Vladislav Vaintroub
Browse files

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
parent 9e91c8d6
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -1627,8 +1627,10 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
    opt_nopager= 1;
    break;
  case OPT_MYSQL_PROTOCOL:
#ifndef EMBEDDED_LIBRARY
    opt_protocol= find_type_or_exit(argument, &sql_protocol_typelib,
                                    opt->name);
#endif
    break;
  case OPT_SERVER_ARG:
#ifdef EMBEDDED_LIBRARY
+1 −16
Original line number Diff line number Diff line
@@ -1851,13 +1851,7 @@ static void DBUGOpenFile(CODE_STATE *cs,
      else
      {
        newfile= !EXISTS(name);
        if (!(fp= fopen(name,
#if defined(MSDOS) || defined(__WIN__)
		append ? "a+c" : "wc"
#else
                append ? "a+" : "w"
#endif
		)))
        if (!(fp= fopen(name, append ? "a+" : "w")))
        {
          (void) fprintf(stderr, ERR_OPEN, cs->process, name);
          perror("");
@@ -2407,13 +2401,4 @@ int i_am_a_dummy_function() {
       return 0;
}

#ifdef __WIN__
char _db_doprnt_;
char _db_enter_;
char _db_pargs_;
char _db_process_;
char _db_push_;
char _db_return_;
#endif /*__WIN__*/

#endif
+0 −16
Original line number Diff line number Diff line
@@ -108,22 +108,6 @@ extern FILE *_db_fp_(void);
#define DBUG_EXPLAIN(buf,len)
#define DBUG_EXPLAIN_INITIAL(buf,len)
#define IF_DBUG(A)

#ifdef __WIN__
/*
   On windows all the dll export has to be declared in the *.def file
   so as we export these symbols in DEBUG mode we have to export
   these in the RELEASE mode also. So below are the dummy symbols
   for the RELEASE export
*/
extern  char _db_doprnt_;
extern  char _db_enter_;
extern  char _db_pargs_;
extern  char _db_process_;
extern  char _db_push_;
extern  char _db_return_;
#endif /*__WIN__*/

#endif
#ifdef	__cplusplus
}
+1 −3
Original line number Diff line number Diff line
@@ -207,9 +207,7 @@ void STDCALL mysql_server_end()
  /* If library called my_init(), free memory allocated by it */
  if (!org_my_init_done)
  {
    my_end(MY_DONT_FREE_DBUG);
    /* Remove TRACING, if enabled by mysql_debug() */
    DBUG_POP();
    my_end(0);
  }
  else
  {
+3 −3
Original line number Diff line number Diff line
@@ -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)
Loading