Commit 645e3135 authored by unknown's avatar unknown
Browse files

The second fix for BUG#19391: IM fails to start after two executions.


server-tools/instance-manager/guardian.cc:
  Removed erroneous unlock() in Guardian_thread::init():
  instance_map is unlocked in the caller.
server-tools/instance-manager/instance_map.cc:
  Added TODO comment.
server-tools/instance-manager/manager.cc:
  Make initialization of alarm infrustructure before starting Guardian
  thread, because Guardian uses thr_alarm().
parent 799c5935
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -271,11 +271,8 @@ int Guardian_thread::init()
  {
    if (!(instance->options.nonguarded))
      if (guard(instance, TRUE))                /* do not lock guardian */
      {
        instance_map->unlock();
        return 1;
  }
  }

  return 0;
}
+1 −1
Original line number Diff line number Diff line
@@ -215,7 +215,7 @@ 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();
  guardian->init(); // TODO: check error status.
  pthread_mutex_unlock(&LOCK_instance_map);
  guardian->unlock();
  return rc;
+31 −12
Original line number Diff line number Diff line
@@ -147,6 +147,25 @@ void manager(const Options &options)
  if (create_pid_file(options.pid_file_name, manager_pid))
    return;

  /*
    Initialize signals and alarm-infrastructure.

    NOTE: To work nicely with LinuxThreads, the signal thread is the first
    thread in the process.

    NOTE:
      After init_thr_alarm() call it's possible to call thr_alarm() (from
      different threads), that results in sending ALARM signal to the alarm
      thread (which can be the main thread). That signal can interrupt
      blocking calls.

      In other words, a blocking call can be interrupted in the main thread
      after init_thr_alarm().
  */

  sigset_t mask;
  set_signals(&mask);

  /* create guardian thread */
  {
    pthread_t guardian_thd_id;
@@ -155,8 +174,15 @@ void manager(const Options &options)

    /*
      NOTE: Guardian should be shutdown first. Only then all other threads
       need to be stopped. This should be done, as guardian is responsible for
       shutting down the instances, and this is a long operation.
      need to be stopped. This should be done, as guardian is responsible
      for shutting down the instances, and this is a long operation.

      NOTE: Guardian uses thr_alarm() when detects current state of
      instances (is_running()), but it is not interfere with
      flush_instances() later in the code, because until flush_instances()
      complete in the main thread, Guardian thread is not permitted to
      process instances. And before flush_instances() there is no instances
      to proceed.
    */

    pthread_attr_init(&guardian_thd_attr);
@@ -172,10 +198,8 @@ void manager(const Options &options)

  }

  /*
    To work nicely with LinuxThreads, the signal thread is the first thread
    in the process.
  */
  /* Load instances. */

  int signo;
  bool shutdown_complete;

@@ -189,11 +213,6 @@ void manager(const Options &options)
    return;
  }

  /* Initialize signals and alarm-infrastructure. */

  sigset_t mask;
  set_signals(&mask);

  /* create the listener */
  {
    pthread_t listener_thd_id;