Commit ec62ccc1 authored by unknown's avatar unknown

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 40e3879e
......@@ -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;
}
......
......@@ -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;
......
......@@ -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;
......
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