Commit a2330c82 authored by Sergei Golubchik's avatar Sergei Golubchik

MDEV-8208 Sporadic SEGFAULT on startup

different fix. remove old ones, wait for THD to be fully
initialized before continuing with the server startup process.

This reverts commits db2e21bf, 13615c5e, 3f515a09, 70113ee1.
parent 744e605d
......@@ -5207,49 +5207,6 @@ static int init_server_components()
}
plugins_are_initialized= TRUE; /* Don't separate from init function */
#ifdef WITH_WSREP
/* Wait for wsrep threads to get created. */
if (wsrep_creating_startup_threads == 1) {
mysql_mutex_lock(&LOCK_thread_count);
while (wsrep_running_threads < 2)
{
mysql_cond_wait(&COND_thread_count, &LOCK_thread_count);
}
/* Now is the time to initialize threads for queries. */
THD *tmp;
I_List_iterator<THD> it(threads);
while ((tmp= it++))
{
if (tmp->wsrep_applier == true)
{
/*
Save/restore server_status and variables.option_bits and they get
altered during init_for_queries().
*/
unsigned int server_status_saved= tmp->server_status;
ulonglong option_bits_saved= tmp->variables.option_bits;
/*
Set THR_THD to temporarily point to this THD to register all the
variables that allocates memory for this THD.
*/
THD *current_thd_saved= current_thd;
set_current_thd(tmp);
tmp->init_for_queries();
/* Restore current_thd. */
set_current_thd(current_thd_saved);
tmp->server_status= server_status_saved;
tmp->variables.option_bits= option_bits_saved;
}
}
mysql_mutex_unlock(&LOCK_thread_count);
}
#endif
/* we do want to exit if there are any other unknown options */
if (remaining_argc > 1)
{
......@@ -5897,6 +5854,9 @@ int mysqld_main(int argc, char **argv)
if (Events::init((THD*) 0, opt_noacl || opt_bootstrap))
unireg_abort(1);
/* It's now safe to use thread specific memory */
mysqld_server_initialized= 1;
if (WSREP_ON)
{
if (opt_bootstrap)
......@@ -5937,9 +5897,6 @@ int mysqld_main(int argc, char **argv)
}
}
/* It's now safe to use thread specific memory */
mysqld_server_initialized= 1;
create_shutdown_thread();
start_handle_manager();
......
......@@ -91,12 +91,6 @@ my_bool wsrep_slave_UK_checks = 0; // slave thread does UK checks
my_bool wsrep_slave_FK_checks = 0; // slave thread does FK checks
bool wsrep_new_cluster = false; // Bootstrap the cluster ?
/*
Set during the creation of first wsrep applier and rollback threads.
Since these threads are critical, abort if the thread creation fails.
*/
my_bool wsrep_creating_startup_threads = 0;
// Use wsrep_gtid_domain_id for galera transactions?
bool wsrep_gtid_mode = 0;
// gtid_domain_id for galera transactions.
......@@ -798,7 +792,6 @@ void wsrep_init_startup (bool first)
if (!wsrep_start_replication()) unireg_abort(1);
wsrep_creating_startup_threads= 1;
wsrep_create_rollbacker();
wsrep_create_appliers(1);
......@@ -1820,21 +1813,11 @@ pthread_handler_t start_wsrep_THD(void *arg)
//thd->version= refresh_version;
thd->proc_info= 0;
thd->set_command(COM_SLEEP);
if (wsrep_creating_startup_threads == 0)
{
thd->init_for_queries();
}
thd->init_for_queries();
mysql_mutex_lock(&LOCK_thread_count);
wsrep_running_threads++;
mysql_cond_broadcast(&COND_thread_count);
if (wsrep_running_threads > 2)
{
wsrep_creating_startup_threads= 0;
}
mysql_mutex_unlock(&LOCK_thread_count);
processor(thd);
......@@ -1877,7 +1860,7 @@ error:
WSREP_ERROR("Failed to create/initialize system thread");
/* Abort if its the first applier/rollbacker thread. */
if (wsrep_creating_startup_threads == 1)
if (!mysqld_server_initialized)
unireg_abort(1);
else
return NULL;
......
......@@ -86,7 +86,6 @@ extern my_bool wsrep_slave_FK_checks;
extern my_bool wsrep_slave_UK_checks;
extern ulong wsrep_running_threads;
extern bool wsrep_new_cluster;
extern my_bool wsrep_creating_startup_threads;
extern bool wsrep_gtid_mode;
extern uint32 wsrep_gtid_domain_id;
......@@ -341,7 +340,6 @@ int wsrep_create_trigger_query(THD *thd, uchar** buf, size_t* buf_len);
#define wsrep_thr_init() do {} while(0)
#define wsrep_thr_deinit() do {} while(0)
#define wsrep_running_threads (0)
#define wsrep_creating_startup_threads (0)
#endif /* WITH_WSREP */
#endif /* WSREP_MYSQLD_H */
......@@ -371,9 +371,20 @@ static void wsrep_replication_process(THD *thd)
static bool create_wsrep_THD(wsrep_thd_processor_fun processor)
{
ulong old_wsrep_running_threads= wsrep_running_threads;
pthread_t unused;
mysql_mutex_lock(&LOCK_thread_count);
bool res= pthread_create(&unused, &connection_attrib, start_wsrep_THD,
(void*)processor);
/*
if starting a thread on server startup, wait until the this thread's THD
is fully initialized (otherwise a THD initialization code might
try to access a partially initialized server data structure - MDEV-8208).
*/
if (!mysqld_server_initialized)
while (old_wsrep_running_threads == wsrep_running_threads)
mysql_cond_wait(&COND_thread_count, &LOCK_thread_count);
mysql_mutex_unlock(&LOCK_thread_count);
return res;
}
......
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