mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
The second fix for BUG#19391: IM fails to start after two executions.
This commit is contained in:
@ -271,10 +271,7 @@ 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()
|
|||||||
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)
|
|||||||
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;
|
||||||
@ -154,9 +173,16 @@ void manager(const Options &options)
|
|||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
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)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* 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)
|
|||||||
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;
|
||||||
|
Reference in New Issue
Block a user