Commit 777bab98 authored by unknown's avatar unknown

Fix Bug #19368 Failure in "flush_instances" causes assert in Thread_registry

Stop guardian and all the rest of threads before shutdown in case of an error


server-tools/instance-manager/instance_map.cc:
  flush_instances shouldn't reinit guardian, if it
  failed to load info about them
server-tools/instance-manager/manager.cc:
  On error we should 1) stop guardian 2) terminate all
  other threads and exit
parent 6acdc271
...@@ -215,7 +215,9 @@ int Instance_map::flush_instances() ...@@ -215,7 +215,9 @@ int Instance_map::flush_instances()
hash_init(&hash, default_charset_info, START_HASH_SIZE, 0, 0, hash_init(&hash, default_charset_info, START_HASH_SIZE, 0, 0,
get_instance_key, delete_instance, 0); get_instance_key, delete_instance, 0);
rc= load(); rc= load();
guardian->init(); // TODO: check error status. /* don't init guardian if we failed to load instances */
if (!rc)
guardian->init(); // TODO: check error status.
pthread_mutex_unlock(&LOCK_instance_map); pthread_mutex_unlock(&LOCK_instance_map);
guardian->unlock(); guardian->unlock();
return rc; return rc;
......
...@@ -104,6 +104,19 @@ int my_sigwait(const sigset_t *set, int *sig) ...@@ -104,6 +104,19 @@ int my_sigwait(const sigset_t *set, int *sig)
#endif #endif
void stop_all(Guardian_thread *guardian, Thread_registry *registry)
{
/*
Let guardian thread know that it should break it's processing cycle,
once it wakes up.
*/
guardian->request_shutdown(true);
/* wake guardian */
pthread_cond_signal(&guardian->COND_guardian);
/* stop all threads */
registry->deliver_shutdown();
}
/* /*
manager - entry point to the main instance manager process: start manager - entry point to the main instance manager process: start
listener thread, write pid file and enter into signal handling. listener thread, write pid file and enter into signal handling.
...@@ -210,7 +223,8 @@ void manager(const Options &options) ...@@ -210,7 +223,8 @@ void manager(const Options &options)
log_error("Cannot init instances repository. This might be caused by " log_error("Cannot init instances repository. This might be caused by "
"the wrong config file options. For instance, missing mysqld " "the wrong config file options. For instance, missing mysqld "
"binary. Aborting."); "binary. Aborting.");
return; stop_all(&guardian_thread, &thread_registry);
goto err;
} }
/* create the listener */ /* create the listener */
...@@ -227,6 +241,7 @@ void manager(const Options &options) ...@@ -227,6 +241,7 @@ void manager(const Options &options)
if (rc) if (rc)
{ {
log_error("manager(): set_stacksize_n_create_thread(listener) failed"); log_error("manager(): set_stacksize_n_create_thread(listener) failed");
stop_all(&guardian_thread, &thread_registry);
goto err; goto err;
} }
...@@ -245,6 +260,7 @@ void manager(const Options &options) ...@@ -245,6 +260,7 @@ void manager(const Options &options)
if ((status= my_sigwait(&mask, &signo)) != 0) if ((status= my_sigwait(&mask, &signo)) != 0)
{ {
log_error("sigwait() failed"); log_error("sigwait() failed");
stop_all(&guardian_thread, &thread_registry);
goto err; goto err;
} }
......
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