Commit 645e3135 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 799c5935
...@@ -271,11 +271,8 @@ int Guardian_thread::init() ...@@ -271,11 +271,8 @@ int Guardian_thread::init()
{ {
if (!(instance->options.nonguarded)) if (!(instance->options.nonguarded))
if (guard(instance, TRUE)) /* do not lock guardian */ if (guard(instance, TRUE)) /* do not lock guardian */
{
instance_map->unlock();
return 1; return 1;
} }
}
return 0; return 0;
} }
......
...@@ -215,7 +215,7 @@ int Instance_map::flush_instances() ...@@ -215,7 +215,7 @@ int Instance_map::flush_instances()
hash_init(&hash, default_charset_info, START_HASH_SIZE, 0, 0, hash_init(&hash, default_charset_info, START_HASH_SIZE, 0, 0,
get_instance_key, delete_instance, 0); get_instance_key, delete_instance, 0);
rc= load(); rc= load();
guardian->init(); guardian->init(); // TODO: check error status.
pthread_mutex_unlock(&LOCK_instance_map); pthread_mutex_unlock(&LOCK_instance_map);
guardian->unlock(); guardian->unlock();
return rc; return rc;
......
...@@ -147,6 +147,25 @@ void manager(const Options &options) ...@@ -147,6 +147,25 @@ void manager(const Options &options)
if (create_pid_file(options.pid_file_name, manager_pid)) if (create_pid_file(options.pid_file_name, manager_pid))
return; 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 */ /* create guardian thread */
{ {
pthread_t guardian_thd_id; pthread_t guardian_thd_id;
...@@ -155,8 +174,15 @@ void manager(const Options &options) ...@@ -155,8 +174,15 @@ void manager(const Options &options)
/* /*
NOTE: Guardian should be shutdown first. Only then all other threads NOTE: Guardian should be shutdown first. Only then all other threads
need to be stopped. This should be done, as guardian is responsible for need to be stopped. This should be done, as guardian is responsible
shutting down the instances, and this is a long operation. 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); pthread_attr_init(&guardian_thd_attr);
...@@ -172,10 +198,8 @@ void manager(const Options &options) ...@@ -172,10 +198,8 @@ void manager(const Options &options)
} }
/* /* Load instances. */
To work nicely with LinuxThreads, the signal thread is the first thread
in the process.
*/
int signo; int signo;
bool shutdown_complete; bool shutdown_complete;
...@@ -189,11 +213,6 @@ void manager(const Options &options) ...@@ -189,11 +213,6 @@ void manager(const Options &options)
return; return;
} }
/* Initialize signals and alarm-infrastructure. */
sigset_t mask;
set_signals(&mask);
/* create the listener */ /* create the listener */
{ {
pthread_t listener_thd_id; 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