diff options
author | unknown <petr/cps@mysql.com/owlet.local> | 2006-10-05 22:07:21 +0400 |
---|---|---|
committer | unknown <petr/cps@mysql.com/owlet.local> | 2006-10-05 22:07:21 +0400 |
commit | 777bab9853a950b37b752bfc9c757ec0fdfa7fe0 (patch) | |
tree | 58f0d1070e128e77846de46a5dfa227b05a2b350 /server-tools | |
parent | 6acdc271f21b5e1d45fe33bc0254c61761db2abd (diff) | |
download | mariadb-git-777bab9853a950b37b752bfc9c757ec0fdfa7fe0.tar.gz |
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
Diffstat (limited to 'server-tools')
-rw-r--r-- | server-tools/instance-manager/instance_map.cc | 4 | ||||
-rw-r--r-- | server-tools/instance-manager/manager.cc | 18 |
2 files changed, 20 insertions, 2 deletions
diff --git a/server-tools/instance-manager/instance_map.cc b/server-tools/instance-manager/instance_map.cc index 3b7f58d8a09..f6662847440 100644 --- a/server-tools/instance-manager/instance_map.cc +++ b/server-tools/instance-manager/instance_map.cc @@ -215,7 +215,9 @@ int Instance_map::flush_instances() hash_init(&hash, default_charset_info, START_HASH_SIZE, 0, 0, get_instance_key, delete_instance, 0); 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); guardian->unlock(); return rc; diff --git a/server-tools/instance-manager/manager.cc b/server-tools/instance-manager/manager.cc index 353dfcf64dc..6f28c39da77 100644 --- a/server-tools/instance-manager/manager.cc +++ b/server-tools/instance-manager/manager.cc @@ -104,6 +104,19 @@ int my_sigwait(const sigset_t *set, int *sig) #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 listener thread, write pid file and enter into signal handling. @@ -210,7 +223,8 @@ void manager(const Options &options) log_error("Cannot init instances repository. This might be caused by " "the wrong config file options. For instance, missing mysqld " "binary. Aborting."); - return; + stop_all(&guardian_thread, &thread_registry); + goto err; } /* create the listener */ @@ -227,6 +241,7 @@ void manager(const Options &options) if (rc) { log_error("manager(): set_stacksize_n_create_thread(listener) failed"); + stop_all(&guardian_thread, &thread_registry); goto err; } @@ -245,6 +260,7 @@ void manager(const Options &options) if ((status= my_sigwait(&mask, &signo)) != 0) { log_error("sigwait() failed"); + stop_all(&guardian_thread, &thread_registry); goto err; } |