Commit 777bab98 authored by unknown's avatar unknown
Browse files

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
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -215,6 +215,8 @@ int Instance_map::flush_instances()
  hash_init(&hash, default_charset_info, START_HASH_SIZE, 0, 0,
            get_instance_key, delete_instance, 0);
  rc= load();
  /* 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();
+17 −1
Original line number Diff line number Diff line
@@ -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;
    }