diff options
author | anozdrin@mysql.com <> | 2006-06-19 14:16:10 +0400 |
---|---|---|
committer | anozdrin@mysql.com <> | 2006-06-19 14:16:10 +0400 |
commit | a992833d837cc77b6749ae8b468d0b596a84d7e8 (patch) | |
tree | 29ea0fdc269f8eb47647db54ead61096cbb102b4 | |
parent | a142a4d97bdb82351852a1c78afa611f4cc8946a (diff) | |
download | mariadb-git-a992833d837cc77b6749ae8b468d0b596a84d7e8.tar.gz |
The second fix for BUG#19391: IM fails to start after two executions.
-rw-r--r-- | server-tools/instance-manager/guardian.cc | 3 | ||||
-rw-r--r-- | server-tools/instance-manager/instance_map.cc | 2 | ||||
-rw-r--r-- | server-tools/instance-manager/manager.cc | 43 |
3 files changed, 32 insertions, 16 deletions
diff --git a/server-tools/instance-manager/guardian.cc b/server-tools/instance-manager/guardian.cc index fa9d877fde6..24844e05776 100644 --- a/server-tools/instance-manager/guardian.cc +++ b/server-tools/instance-manager/guardian.cc @@ -271,10 +271,7 @@ int Guardian_thread::init() { if (!(instance->options.nonguarded)) if (guard(instance, TRUE)) /* do not lock guardian */ - { - instance_map->unlock(); return 1; - } } return 0; diff --git a/server-tools/instance-manager/instance_map.cc b/server-tools/instance-manager/instance_map.cc index 543c9c31bfa..3b7f58d8a09 100644 --- a/server-tools/instance-manager/instance_map.cc +++ b/server-tools/instance-manager/instance_map.cc @@ -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; diff --git a/server-tools/instance-manager/manager.cc b/server-tools/instance-manager/manager.cc index 00ef50a84e1..353dfcf64dc 100644 --- a/server-tools/instance-manager/manager.cc +++ b/server-tools/instance-manager/manager.cc @@ -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; @@ -154,9 +173,16 @@ void manager(const Options &options) int rc; /* - 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. + 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. + + 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; |