mirror of
https://github.com/MariaDB/server.git
synced 2025-01-20 14:02:32 +01:00
76f813a52e
The cause of im_daemon_life_cycle.imtest random failures was the following behaviour of some implementations of LINUX threads: let's suppose that a process has several threads (in LINUX threads, there is a separate process for each thread). When the main process gets killed, the parent receives SIGCHLD before all threads (child processes) die. In other words, the parent receives SIGCHLD, when its child is not completely dead. In terms of IM, that means that IM-angel receives SIGCHLD when IM-main is not dead and still holds some resources. After receiving SIGCHLD, IM-angel restarts IM-main, but IM-main failed to initialize, because previous instance (copy) of IM-main still holds server socket (TCP-port). Another problem here was that IM-angel restarted IM-main only if it was killed by signal. If it exited with error, IM-angel thought it's intended / graceful shutdown and exited itself. So, when the second instance of IM-main failed to initialize, IM-angel thought it's intended shutdown and quit. The fix is 1. to change IM-angel so that it restarts IM-main if it exited with error code; 2. to change IM-main so that it returns proper exit code in case of failure.
71 lines
1.9 KiB
C++
71 lines
1.9 KiB
C++
/* Copyright (C) 2003-2006 MySQL AB
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; version 2 of the License.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
|
|
|
#ifndef INCLUDES_MYSQL_INSTANCE_MANAGER_MANAGER_H
|
|
#define INCLUDES_MYSQL_INSTANCE_MANAGER_MANAGER_H
|
|
|
|
#if defined(__GNUC__) && defined(USE_PRAGMA_INTERFACE)
|
|
#pragma interface
|
|
#endif
|
|
|
|
#include <my_global.h>
|
|
|
|
class Guardian;
|
|
class Instance_map;
|
|
class Thread_registry;
|
|
class User_map;
|
|
|
|
class Manager
|
|
{
|
|
public:
|
|
static int main();
|
|
|
|
static int flush_instances();
|
|
|
|
public:
|
|
/**
|
|
These methods return a non-NULL value only for the duration
|
|
of main().
|
|
*/
|
|
static Instance_map *get_instance_map() { return p_instance_map; }
|
|
static Guardian *get_guardian() { return p_guardian; }
|
|
static Thread_registry *get_thread_registry() { return p_thread_registry; }
|
|
static User_map *get_user_map() { return p_user_map; }
|
|
|
|
public:
|
|
#ifndef __WIN__
|
|
static bool is_linux_threads() { return linux_threads; }
|
|
#endif // __WIN__
|
|
|
|
private:
|
|
static void stop_all_threads();
|
|
static bool init_user_map(User_map *user_map);
|
|
|
|
private:
|
|
static Guardian *p_guardian;
|
|
static Instance_map *p_instance_map;
|
|
static Thread_registry *p_thread_registry;
|
|
static User_map *p_user_map;
|
|
|
|
#ifndef __WIN__
|
|
/*
|
|
This flag is set if Instance Manager is running on the system using
|
|
LinuxThreads.
|
|
*/
|
|
static bool linux_threads;
|
|
#endif // __WIN__
|
|
};
|
|
|
|
#endif // INCLUDES_MYSQL_INSTANCE_MANAGER_MANAGER_H
|