From 053b460707fa22430bc69b71fda0b2d96318cd97 Mon Sep 17 00:00:00 2001
From: unknown <petr/cps@mysql.com/owlet.local>
Date: Thu, 5 Oct 2006 22:07:21 +0400
Subject: [PATCH] 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
---
 server-tools/instance-manager/instance_map.cc |  4 +++-
 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;
     }
 
-- 
2.30.9