• Vladislav Vaintroub's avatar
    Bug#38522: 5 seconds delay when closing application using embedded server · ec5ce9b0
    Vladislav Vaintroub authored
                      
    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()
    ec5ce9b0
my_dbug.h 4.47 KB