diff options
Diffstat (limited to 'server-tools')
20 files changed, 204 insertions, 199 deletions
diff --git a/server-tools/instance-manager/IMService.cpp b/server-tools/instance-manager/IMService.cpp index f9ea7ee471d..e8943ef5706 100644 --- a/server-tools/instance-manager/IMService.cpp +++ b/server-tools/instance-manager/IMService.cpp @@ -21,22 +21,22 @@ void IMService::Stop() { ReportStatus(SERVICE_STOP_PENDING); - // stop the IM work + /* stop the IM work */ raise(SIGTERM); } void IMService::Run(DWORD argc, LPTSTR *argv) { - // report to the SCM that we're about to start + /* report to the SCM that we're about to start */ ReportStatus((DWORD)SERVICE_START_PENDING); Options::load(argc, argv); - // init goes here + /* init goes here */ ReportStatus((DWORD)SERVICE_RUNNING); - // wait for main loop to terminate - manager(); + /* wait for main loop to terminate */ + (void) Manager::main(); Options::cleanup(); } diff --git a/server-tools/instance-manager/Makefile.am b/server-tools/instance-manager/Makefile.am index 4719828081a..49f5bc285b6 100644 --- a/server-tools/instance-manager/Makefile.am +++ b/server-tools/instance-manager/Makefile.am @@ -61,6 +61,8 @@ client_settings.h: libexec_PROGRAMS= mysqlmanager +mysqlmanager_CXXFLAGS= -Werror + mysqlmanager_SOURCES= command.cc command.h mysqlmanager.cc \ manager.h manager.cc log.h log.cc \ thread_registry.h thread_registry.cc \ diff --git a/server-tools/instance-manager/command.cc b/server-tools/instance-manager/command.cc index f76366d5661..0ada11e8865 100644 --- a/server-tools/instance-manager/command.cc +++ b/server-tools/instance-manager/command.cc @@ -19,10 +19,12 @@ #endif #include "command.h" +#include "manager.h" -Command::Command(Instance_map *instance_map_arg) - :instance_map(instance_map_arg) +Command::Command() + :guardian(Manager::get_guardian()), + instance_map(Manager::get_instance_map()) {} Command::~Command() diff --git a/server-tools/instance-manager/command.h b/server-tools/instance-manager/command.h index f31ea404867..7f5ec78f0d2 100644 --- a/server-tools/instance-manager/command.h +++ b/server-tools/instance-manager/command.h @@ -24,6 +24,7 @@ /* Class responsible for allocation of IM commands. */ +class Guardian; class Instance_map; struct st_net; @@ -36,7 +37,7 @@ struct st_net; class Command { public: - Command(Instance_map *instance_map_arg= 0); + Command(); virtual ~Command(); /* @@ -53,6 +54,7 @@ public: virtual int execute(st_net *net, ulong connection_id) = 0; protected: + Guardian *guardian; Instance_map *instance_map; }; diff --git a/server-tools/instance-manager/commands.cc b/server-tools/instance-manager/commands.cc index 66140b8b049..50ab15f1ed3 100644 --- a/server-tools/instance-manager/commands.cc +++ b/server-tools/instance-manager/commands.cc @@ -242,10 +242,8 @@ int Flush_instances::execute(st_net *net, ulong connection_id) Implementation of Abstract_instance_cmd. **************************************************************************/ -Abstract_instance_cmd::Abstract_instance_cmd( - Instance_map *instance_map_arg, const LEX_STRING *instance_name_arg) - :Command(instance_map_arg), - instance_name(instance_name_arg) +Abstract_instance_cmd::Abstract_instance_cmd(const LEX_STRING *instance_name_arg) + :instance_name(instance_name_arg) { /* MT-NOTE: we can not make a search for Instance object here, @@ -285,9 +283,8 @@ int Abstract_instance_cmd::execute(st_net *net, ulong connection_id) Implementation of Show_instance_status. **************************************************************************/ -Show_instance_status::Show_instance_status(Instance_map *instance_map_arg, - const LEX_STRING *instance_name_arg) - :Abstract_instance_cmd(instance_map_arg, instance_name_arg) +Show_instance_status::Show_instance_status(const LEX_STRING *instance_name_arg) + :Abstract_instance_cmd(instance_name_arg) { } @@ -406,8 +403,8 @@ int Show_instance_status::write_data(st_net *net, Instance *instance) **************************************************************************/ Show_instance_options::Show_instance_options( - Instance_map *instance_map_arg, const LEX_STRING *instance_name_arg) - :Abstract_instance_cmd(instance_map_arg, instance_name_arg) + const LEX_STRING *instance_name_arg) + :Abstract_instance_cmd(instance_name_arg) { } @@ -501,9 +498,8 @@ int Show_instance_options::write_data(st_net *net, Instance *instance) Implementation of Start_instance. **************************************************************************/ -Start_instance::Start_instance(Instance_map *instance_map_arg, - const LEX_STRING *instance_name_arg) - :Abstract_instance_cmd(instance_map_arg, instance_name_arg) +Start_instance::Start_instance(const LEX_STRING *instance_name_arg) + :Abstract_instance_cmd(instance_name_arg) { } @@ -543,9 +539,8 @@ int Start_instance::send_ok_response(st_net *net, ulong connection_id) Implementation of Stop_instance. **************************************************************************/ -Stop_instance::Stop_instance(Instance_map *instance_map_arg, - const LEX_STRING *instance_name_arg) - :Abstract_instance_cmd(instance_map_arg, instance_name_arg) +Stop_instance::Stop_instance(const LEX_STRING *instance_name_arg) + :Abstract_instance_cmd(instance_name_arg) { } @@ -585,10 +580,8 @@ int Stop_instance::send_ok_response(st_net *net, ulong connection_id) Implementation for Create_instance. **************************************************************************/ -Create_instance::Create_instance(Instance_map *instance_map_arg, - const LEX_STRING *instance_name_arg) - :Command(instance_map_arg), - instance_name(instance_name_arg) +Create_instance::Create_instance(const LEX_STRING *instance_name_arg) + :instance_name(instance_name_arg) { } @@ -795,9 +788,8 @@ int Create_instance::execute(st_net *net, ulong connection_id) Implementation for Drop_instance. **************************************************************************/ -Drop_instance::Drop_instance(Instance_map *instance_map_arg, - const LEX_STRING *instance_name_arg) - :Abstract_instance_cmd(instance_map_arg, instance_name_arg) +Drop_instance::Drop_instance(const LEX_STRING *instance_name_arg) + :Abstract_instance_cmd(instance_name_arg) { } @@ -863,11 +855,10 @@ int Drop_instance::send_ok_response(st_net *net, ulong connection_id) Implementation for Show_instance_log. **************************************************************************/ -Show_instance_log::Show_instance_log(Instance_map *instance_map_arg, - const LEX_STRING *instance_name_arg, +Show_instance_log::Show_instance_log(const LEX_STRING *instance_name_arg, Log_type log_type_arg, uint size_arg, uint offset_arg) - :Abstract_instance_cmd(instance_map_arg, instance_name_arg), + :Abstract_instance_cmd(instance_name_arg), log_type(log_type_arg), size(size_arg), offset(offset_arg) @@ -1013,9 +1004,8 @@ int Show_instance_log::write_data(st_net *net, Instance *instance) **************************************************************************/ Show_instance_log_files::Show_instance_log_files - (Instance_map *instance_map_arg, - const LEX_STRING *instance_name_arg) - :Abstract_instance_cmd(instance_map_arg, instance_name_arg) + (const LEX_STRING *instance_name_arg) + :Abstract_instance_cmd(instance_name_arg) { } @@ -1214,9 +1204,8 @@ C_MODE_END /**************************************************************************/ -Abstract_option_cmd::Abstract_option_cmd(Instance_map *instance_map_arg) - :Command(instance_map_arg), - initialized(FALSE) +Abstract_option_cmd::Abstract_option_cmd() + :initialized(FALSE) { } @@ -1400,12 +1389,6 @@ int Abstract_option_cmd::execute_impl(st_net *net, ulong connection_id) Implementation of Set_option. **************************************************************************/ -Set_option::Set_option(Instance_map *instance_map_arg) - :Abstract_option_cmd(instance_map_arg) -{ -} - - /* This operation parses SET options. @@ -1580,12 +1563,6 @@ int Set_option::process_option(Instance *instance, Named_value *option) Implementation of Unset_option. **************************************************************************/ -Unset_option::Unset_option(Instance_map *instance_map_arg) - :Abstract_option_cmd(instance_map_arg) -{ -} - - /* This operation parses UNSET options. diff --git a/server-tools/instance-manager/commands.h b/server-tools/instance-manager/commands.h index 9a9911f2358..cf753d8368c 100644 --- a/server-tools/instance-manager/commands.h +++ b/server-tools/instance-manager/commands.h @@ -38,9 +38,6 @@ class Show_instances : public Command { public: - Show_instances(Instance_map *instance_map_arg): Command(instance_map_arg) - {} - int execute(st_net *net, ulong connection_id); private: @@ -57,9 +54,6 @@ private: class Flush_instances : public Command { public: - Flush_instances(Instance_map *instance_map_arg): Command(instance_map_arg) - {} - int execute(st_net *net, ulong connection_id); }; @@ -71,8 +65,7 @@ public: class Abstract_instance_cmd : public Command { public: - Abstract_instance_cmd(Instance_map *instance_map_arg, - const LEX_STRING *instance_name_arg); + Abstract_instance_cmd(const LEX_STRING *instance_name_arg); public: virtual int execute(st_net *net, ulong connection_id); @@ -108,8 +101,7 @@ private: class Show_instance_status : public Abstract_instance_cmd { public: - Show_instance_status(Instance_map *instance_map_arg, - const LEX_STRING *instance_name_arg); + Show_instance_status(const LEX_STRING *instance_name_arg); protected: virtual int execute_impl(st_net *net, Instance *instance); @@ -129,8 +121,7 @@ private: class Show_instance_options : public Abstract_instance_cmd { public: - Show_instance_options(Instance_map *instance_map_arg, - const LEX_STRING *instance_name_arg); + Show_instance_options(const LEX_STRING *instance_name_arg); protected: virtual int execute_impl(st_net *net, Instance *instance); @@ -150,8 +141,7 @@ private: class Start_instance : public Abstract_instance_cmd { public: - Start_instance(Instance_map *instance_map_arg, - const LEX_STRING *instance_name_arg); + Start_instance(const LEX_STRING *instance_name_arg); protected: virtual int execute_impl(st_net *net, Instance *instance); @@ -167,8 +157,7 @@ protected: class Stop_instance : public Abstract_instance_cmd { public: - Stop_instance(Instance_map *instance_map_arg, - const LEX_STRING *instance_name_arg); + Stop_instance(const LEX_STRING *instance_name_arg); protected: virtual int execute_impl(st_net *net, Instance *instance); @@ -184,8 +173,7 @@ protected: class Create_instance : public Command { public: - Create_instance(Instance_map *instance_map_arg, - const LEX_STRING *instance_name_arg); + Create_instance(const LEX_STRING *instance_name_arg); public: bool init(const char **text); @@ -220,8 +208,7 @@ private: class Drop_instance : public Abstract_instance_cmd { public: - Drop_instance(Instance_map *instance_map_arg, - const LEX_STRING *instance_name_arg); + Drop_instance(const LEX_STRING *instance_name_arg); protected: virtual int execute_impl(st_net *net, Instance *instance); @@ -238,8 +225,7 @@ protected: class Show_instance_log : public Abstract_instance_cmd { public: - Show_instance_log(Instance_map *instance_map_arg, - const LEX_STRING *instance_name_arg, + Show_instance_log(const LEX_STRING *instance_name_arg, Log_type log_type_arg, uint size_arg, uint offset_arg); protected: @@ -266,8 +252,7 @@ private: class Show_instance_log_files : public Abstract_instance_cmd { public: - Show_instance_log_files(Instance_map *instance_map_arg, - const LEX_STRING *instance_name_arg); + Show_instance_log_files(const LEX_STRING *instance_name_arg); protected: virtual int execute_impl(st_net *net, Instance *instance); @@ -299,7 +284,7 @@ public: virtual int execute(st_net *net, ulong connection_id); protected: - Abstract_option_cmd(Instance_map *instance_map_arg); + Abstract_option_cmd(); int correct_file(Instance *instance, Named_value *option, bool skip); @@ -326,9 +311,6 @@ private: class Set_option : public Abstract_option_cmd { -public: - Set_option(Instance_map *instance_map_arg); - protected: virtual bool parse_args(const char **text); virtual int process_option(Instance *instance, Named_value *option); @@ -342,9 +324,6 @@ protected: class Unset_option: public Abstract_option_cmd { -public: - Unset_option(Instance_map *instance_map_arg); - protected: virtual bool parse_args(const char **text); virtual int process_option(Instance *instance, Named_value *option); @@ -363,11 +342,6 @@ protected: class Syntax_error : public Command { public: - /* This is just to avoid compiler warning. */ - Syntax_error() :Command(NULL) - {} - -public: int execute(st_net *net, ulong connection_id); }; diff --git a/server-tools/instance-manager/guardian.cc b/server-tools/instance-manager/guardian.cc index 03bfadd8571..71ad0760b06 100644 --- a/server-tools/instance-manager/guardian.cc +++ b/server-tools/instance-manager/guardian.cc @@ -31,16 +31,16 @@ #include "mysql_manager_error.h" -pthread_handler_t guardian(void *arg) +pthread_handler_t guardian_thread_func(void *arg) { - Guardian_thread *guardian_thread= (Guardian_thread *) arg; - guardian_thread->run(); + Guardian *guardian= (Guardian *) arg; + guardian->run(); return 0; } const char * -Guardian_thread::get_instance_state_name(enum_instance_state state) +Guardian::get_instance_state_name(enum_instance_state state) { switch (state) { case NOT_STARTED: @@ -69,10 +69,10 @@ Guardian_thread::get_instance_state_name(enum_instance_state state) } -Guardian_thread::Guardian_thread(Thread_registry &thread_registry_arg, +Guardian::Guardian(Thread_registry &thread_registry_arg, Instance_map *instance_map_arg, uint monitoring_interval_arg) : - Guardian_thread_args(thread_registry_arg, instance_map_arg, + Guardian_args(thread_registry_arg, instance_map_arg, monitoring_interval_arg), thread_info(pthread_self(), TRUE), guarded_instances(0) { @@ -84,7 +84,7 @@ Guardian_thread::Guardian_thread(Thread_registry &thread_registry_arg, } -Guardian_thread::~Guardian_thread() +Guardian::~Guardian() { /* delay guardian destruction to the moment when no one needs it */ pthread_mutex_lock(&LOCK_guardian); @@ -95,7 +95,7 @@ Guardian_thread::~Guardian_thread() } -void Guardian_thread::request_shutdown() +void Guardian::request_shutdown() { pthread_mutex_lock(&LOCK_guardian); /* stop instances or just clean up Guardian repository */ @@ -105,7 +105,7 @@ void Guardian_thread::request_shutdown() } -void Guardian_thread::process_instance(Instance *instance, +void Guardian::process_instance(Instance *instance, GUARD_NODE *current_node, LIST **guarded_instances, LIST *node) @@ -244,7 +244,7 @@ void Guardian_thread::process_instance(Instance *instance, is fine go and sleep for some time. */ -void Guardian_thread::run() +void Guardian::run() { Instance *instance; LIST *node; @@ -292,7 +292,7 @@ void Guardian_thread::run() } -int Guardian_thread::is_stopped() +int Guardian::is_stopped() { int var; pthread_mutex_lock(&LOCK_guardian); @@ -307,10 +307,10 @@ int Guardian_thread::is_stopped() add all of the instances, which don't have 'nonguarded' option specified. SYNOPSYS - Guardian_thread::init() + Guardian::init() NOTE: The operation should be invoked with the following locks acquired: - - Guardian_thread; + - Guardian; - Instance_map; RETURN @@ -318,7 +318,7 @@ int Guardian_thread::is_stopped() 1 - error occured */ -int Guardian_thread::init() +int Guardian::init() { Instance *instance; Instance_map::Iterator iterator(instance_map); @@ -360,7 +360,7 @@ int Guardian_thread::init() 1 - error occured */ -int Guardian_thread::guard(Instance *instance, bool nolock) +int Guardian::guard(Instance *instance, bool nolock) { LIST *node; GUARD_NODE *content; @@ -397,7 +397,7 @@ int Guardian_thread::guard(Instance *instance, bool nolock) a piece of the MEM_ROOT). */ -int Guardian_thread::stop_guard(Instance *instance) +int Guardian::stop_guard(Instance *instance) { LIST *node; @@ -434,7 +434,7 @@ int Guardian_thread::stop_guard(Instance *instance) 1 - error occured */ -int Guardian_thread::stop_instances() +int Guardian::stop_instances() { LIST *node; node= guarded_instances; @@ -462,19 +462,19 @@ int Guardian_thread::stop_instances() } -void Guardian_thread::lock() +void Guardian::lock() { pthread_mutex_lock(&LOCK_guardian); } -void Guardian_thread::unlock() +void Guardian::unlock() { pthread_mutex_unlock(&LOCK_guardian); } -LIST *Guardian_thread::find_instance_node(Instance *instance) +LIST *Guardian::find_instance_node(Instance *instance) { LIST *node= guarded_instances; @@ -494,7 +494,7 @@ LIST *Guardian_thread::find_instance_node(Instance *instance) } -bool Guardian_thread::is_active(Instance *instance) +bool Guardian::is_active(Instance *instance) { bool guarded; diff --git a/server-tools/instance-manager/guardian.h b/server-tools/instance-manager/guardian.h index 27ca155fd67..4c518dddf23 100644 --- a/server-tools/instance-manager/guardian.h +++ b/server-tools/instance-manager/guardian.h @@ -31,15 +31,15 @@ class Instance_map; class Thread_registry; struct GUARD_NODE; -pthread_handler_t guardian(void *arg); +pthread_handler_t guardian_thread_func(void *arg); -struct Guardian_thread_args +struct Guardian_args { Thread_registry &thread_registry; Instance_map *instance_map; int monitoring_interval; - Guardian_thread_args(Thread_registry &thread_registry_arg, + Guardian_args(Thread_registry &thread_registry_arg, Instance_map *instance_map_arg, uint monitoring_interval_arg) : thread_registry(thread_registry_arg), @@ -54,7 +54,7 @@ struct Guardian_thread_args instances. */ -class Guardian_thread: public Guardian_thread_args +class Guardian: public Guardian_args { public: /* states of an instance */ @@ -82,10 +82,10 @@ public: /* Return client state name. */ static const char *get_instance_state_name(enum_instance_state state); - Guardian_thread(Thread_registry &thread_registry_arg, + Guardian(Thread_registry &thread_registry_arg, Instance_map *instance_map_arg, uint monitoring_interval_arg); - ~Guardian_thread(); + ~Guardian(); /* Main funtion of the thread */ void run(); /* Initialize or refresh the list of guarded instances */ @@ -140,8 +140,8 @@ private: }; -inline Guardian_thread::enum_instance_state -Guardian_thread::get_instance_state(LIST *instance_node) +inline Guardian::enum_instance_state +Guardian::get_instance_state(LIST *instance_node) { return ((GUARD_NODE *) instance_node->data)->state; } diff --git a/server-tools/instance-manager/instance_map.cc b/server-tools/instance-manager/instance_map.cc index 2f830e616c4..f0fb8b9669e 100644 --- a/server-tools/instance-manager/instance_map.cc +++ b/server-tools/instance-manager/instance_map.cc @@ -276,7 +276,7 @@ void Instance_map::unlock() FLUSH INSTANCES without prior stop of all running instances. NOTE: The operation should be invoked with the following locks acquired: - - Guardian_thread; + - Guardian; - Instance_map; */ @@ -537,7 +537,7 @@ const char *Instance_map::get_instance_state_name(Instance *instance) { /* The instance is managed by Guardian: we can report precise state. */ - return Guardian_thread::get_instance_state_name( + return Guardian::get_instance_state_name( guardian->get_instance_state(instance_node)); } diff --git a/server-tools/instance-manager/instance_map.h b/server-tools/instance-manager/instance_map.h index 9de40e35e0f..48fc8edc5ad 100644 --- a/server-tools/instance-manager/instance_map.h +++ b/server-tools/instance-manager/instance_map.h @@ -25,7 +25,7 @@ #pragma interface #endif -class Guardian_thread; +class Guardian; class Instance; class Named_value_arr; class Thread_registry; @@ -115,13 +115,13 @@ public: MT-NOTE: the options must be called under acquired locks of the following objects: - Instance_map; - - Guardian_thread; + - Guardian; */ const char *get_instance_state_name(Instance *instance); public: const char *mysqld_path; - Guardian_thread *guardian; + Guardian *guardian; private: /* loads options from config files */ diff --git a/server-tools/instance-manager/manager.cc b/server-tools/instance-manager/manager.cc index 4bd298eedec..55d7137c97a 100644 --- a/server-tools/instance-manager/manager.cc +++ b/server-tools/instance-manager/manager.cc @@ -37,33 +37,6 @@ #include "user_map.h" -int create_pid_file(const char *pid_file_name, int pid) -{ - FILE *pid_file; - - if (!(pid_file= my_fopen(pid_file_name, O_WRONLY | O_CREAT | O_BINARY, - MYF(0)))) - { - log_error("Error: can not create pid file '%s': %s (errno: %d)", - (const char *) pid_file_name, - (const char *) strerror(errno), - (int) errno); - return 1; - } - - if (fprintf(pid_file, "%d\n", (int) pid) <= 0) - { - log_error("Error: can not write to pid file '%s': %s (errno: %d)", - (const char *) pid_file_name, - (const char *) strerror(errno), - (int) errno); - return 1; - } - - my_fclose(pid_file, MYF(0)); - - return 0; -} #ifndef __WIN__ void set_signals(sigset_t *mask) @@ -120,7 +93,7 @@ int my_sigwait(const sigset_t *set, int *sig) #endif -void stop_all(Guardian_thread *guardian, Thread_registry *registry) +void stop_all(Guardian *guardian, Thread_registry *registry) { /* Let guardian thread know that it should break it's processing cycle, @@ -133,6 +106,13 @@ void stop_all(Guardian_thread *guardian, Thread_registry *registry) registry->deliver_shutdown(); } +/********************************************************************** + Manager implementation +***********************************************************************/ + +Guardian *Manager::p_guardian; +Instance_map *Manager::p_instance_map; + /* manager - entry point to the main instance manager process: start listener thread, write pid file and enter into signal handling. @@ -142,9 +122,10 @@ void stop_all(Guardian_thread *guardian, Thread_registry *registry) TODO: how about returning error status. */ -void manager() +int Manager::main() { int err_code; + int rc= 1; const char *err_msg; bool shutdown_complete= FALSE; @@ -158,21 +139,21 @@ void manager() User_map user_map; Instance_map instance_map(Options::Main::default_mysqld_path, thread_registry); - Guardian_thread guardian_thread(thread_registry, - &instance_map, - Options::Main::monitoring_interval); + Guardian guardian(thread_registry, &instance_map, + Options::Main::monitoring_interval); Listener_thread_args listener_args(thread_registry, user_map, instance_map); manager_pid= getpid(); - instance_map.guardian= &guardian_thread; + p_instance_map= &instance_map; + p_guardian= instance_map.guardian= &guardian; /* Initialize instance map. */ if (instance_map.init()) { log_error("Error: can not initialize instance list: out of memory."); - return; + return 1; } /* Initialize user map and load password file. */ @@ -180,7 +161,7 @@ void manager() if (user_map.init()) { log_error("Error: can not initialize user list: out of memory."); - return; + return 1; } if ((err_code= user_map.load(Options::Main::password_file_name, &err_msg))) @@ -199,7 +180,7 @@ void manager() else { log_error("Error: %s.", (const char *) err_msg); - return; + return 1; } } @@ -210,7 +191,7 @@ void manager() (int) manager_pid); if (create_pid_file(Options::Main::pid_file_name, manager_pid)) - return; /* necessary logging has been already done. */ + return 1; /* necessary logging has been already done. */ /* Initialize signals and alarm-infrastructure. @@ -253,7 +234,7 @@ void manager() pthread_attr_init(&guardian_thd_attr); pthread_attr_setdetachstate(&guardian_thd_attr, PTHREAD_CREATE_DETACHED); rc= set_stacksize_n_create_thread(&guardian_thd_id, &guardian_thd_attr, - guardian, &guardian_thread); + guardian_thread_func, &guardian); pthread_attr_destroy(&guardian_thd_attr); if (rc) { @@ -279,7 +260,7 @@ void manager() log_error("Cannot init instances repository. This might be caused by " "the wrong config file options. For instance, missing mysqld " "binary. Aborting."); - stop_all(&guardian_thread, &thread_registry); + stop_all(&guardian, &thread_registry); goto err; } } @@ -298,7 +279,7 @@ void manager() if (rc) { log_error("manager(): set_stacksize_n_create_thread(listener) failed"); - stop_all(&guardian_thread, &thread_registry); + stop_all(&guardian, &thread_registry); goto err; } } @@ -307,7 +288,7 @@ void manager() After the list of guarded instances have been initialized, Guardian should start them. */ - pthread_cond_signal(&guardian_thread.COND_guardian); + pthread_cond_signal(&guardian.COND_guardian); log_info("Main loop: started."); @@ -319,7 +300,7 @@ void manager() if ((status= my_sigwait(&mask, &signo)) != 0) { log_error("sigwait() failed"); - stop_all(&guardian_thread, &thread_registry); + stop_all(&guardian, &thread_registry); goto err; } @@ -328,8 +309,8 @@ void manager() - we are waiting for SIGINT, SIGTERM -- signals that mean we should shutdown; - as shutdown signal is caught, we stop Guardian thread (by calling - Guardian_thread::request_shutdown()); - - as Guardian_thread is stopped, it sends SIGTERM to this thread + Guardian::request_shutdown()); + - as Guardian is stopped, it sends SIGTERM to this thread (by calling Thread_registry::request_shutdown()), so that the my_sigwait() above returns; - as we catch the second SIGTERM, we send signals to all threads @@ -355,10 +336,10 @@ void manager() { log_info("Main loop: got shutdown signal."); - if (!guardian_thread.is_stopped()) + if (!guardian.is_stopped()) { - guardian_thread.request_shutdown(); - pthread_cond_signal(&guardian_thread.COND_guardian); + guardian.request_shutdown(); + pthread_cond_signal(&guardian.COND_guardian); } else { @@ -370,6 +351,8 @@ void manager() log_info("Main loop: finished."); + rc= 0; + err: /* delete the pid file */ my_delete(Options::Main::pid_file_name, MYF(0)); @@ -379,4 +362,5 @@ err: end_thr_alarm(1); /* don't pthread_exit to kill all threads who did not shut down in time */ #endif + return rc; } diff --git a/server-tools/instance-manager/manager.h b/server-tools/instance-manager/manager.h index 7aa4b3e1a96..5abe029a3d8 100644 --- a/server-tools/instance-manager/manager.h +++ b/server-tools/instance-manager/manager.h @@ -16,8 +16,29 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -void manager(); +#if defined(__GNUC__) && defined(USE_PRAGMA_INTERFACE) +#pragma interface +#endif -int create_pid_file(const char *pid_file_name, int pid); +class Guardian; +class Instance_map; + +class Manager +{ +public: + static int main(); + /** + These methods return a non-zero value only for the duration + of main(). + */ + static Instance_map *get_instance_map() { return p_instance_map; } + static Guardian *get_guardian() { return p_guardian; } + +private: + static int manager_impl(); +private: + static Guardian *p_guardian; + static Instance_map *p_instance_map; +}; #endif // INCLUDES_MYSQL_INSTANCE_MANAGER_MANAGER_H diff --git a/server-tools/instance-manager/mysql_connection.cc b/server-tools/instance-manager/mysql_connection.cc index 82b24491903..72081234c94 100644 --- a/server-tools/instance-manager/mysql_connection.cc +++ b/server-tools/instance-manager/mysql_connection.cc @@ -315,7 +315,7 @@ int Mysql_connection_thread::do_command() packet= (char*) net.read_pos; enum enum_server_command command= (enum enum_server_command) (uchar) *packet; - log_info("connection %lu: packet_length=%lu, command=%d", + log_info("connection %d: packet_length=%d, command=%d", (int) connection_id, (int) packet_length, (int) command); return dispatch_command(command, packet + 1, packet_length - 1); } @@ -336,10 +336,10 @@ int Mysql_connection_thread::dispatch_command(enum enum_server_command command, break; case COM_QUERY: { - log_info("query for connection %lu : ----\n%s\n-------------------------", + log_info("query for connection %d : ----\n%s\n-------------------------", (int) connection_id, (const char *) packet); - if (Command *command= parse_command(&instance_map, packet)) + if (Command *command= parse_command(packet)) { int res= 0; log_info("query for connection %lu successfully parsed", diff --git a/server-tools/instance-manager/mysqlmanager.cc b/server-tools/instance-manager/mysqlmanager.cc index 177b761b419..475c7a3ab9f 100644 --- a/server-tools/instance-manager/mysqlmanager.cc +++ b/server-tools/instance-manager/mysqlmanager.cc @@ -31,6 +31,7 @@ #include "log.h" #include "manager.h" #include "options.h" +#include "priv.h" #include "user_management_commands.h" #ifdef __WIN__ @@ -117,7 +118,7 @@ int main(int argc, char *argv[]) angel(); } - manager(); + (void) Manager::main(); /* ignore the return value for now */ #else @@ -131,7 +132,7 @@ int main(int argc, char *argv[]) } else { - manager(); + (void) Manager::main(); /* ignore the return value for now */ } #endif @@ -384,8 +385,8 @@ spawn: } /* mysqlmanager successfully exited, let's silently evaporate - If we return to main we fall into the manager() function, so let's - simply exit(). + If we return to main we will fall into the manager functionality, + so let's simply exit(). */ exit(0); } diff --git a/server-tools/instance-manager/parse.cc b/server-tools/instance-manager/parse.cc index 048f7983b32..be3adc4167a 100644 --- a/server-tools/instance-manager/parse.cc +++ b/server-tools/instance-manager/parse.cc @@ -269,7 +269,7 @@ void skip_spaces(const char **text) } -Command *parse_command(Instance_map *map, const char *text) +Command *parse_command(const char *text) { uint word_len; LEX_STRING instance_name; @@ -294,7 +294,7 @@ Command *parse_command(Instance_map *map, const char *text) if (tok1 == TOK_CREATE) { - Create_instance *cmd= new Create_instance(map, &instance_name); + Create_instance *cmd= new Create_instance(&instance_name); if (!cmd) return NULL; /* Report ER_OUT_OF_RESOURCES. */ @@ -317,16 +317,16 @@ Command *parse_command(Instance_map *map, const char *text) switch (tok1) { case TOK_START: - command= new Start_instance(map, &instance_name); + command= new Start_instance(&instance_name); break; case TOK_STOP: - command= new Stop_instance(map, &instance_name); + command= new Stop_instance(&instance_name); break; case TOK_CREATE: ; /* command already initialized. */ break; case TOK_DROP: - command= new Drop_instance(map, &instance_name); + command= new Drop_instance(&instance_name); break; default: /* this is impossible, but nevertheless... */ DBUG_ASSERT(0); @@ -340,7 +340,7 @@ Command *parse_command(Instance_map *map, const char *text) if (word_len) goto syntax_error; - command= new Flush_instances(map); + command= new Flush_instances(); break; case TOK_UNSET: case TOK_SET: @@ -348,9 +348,9 @@ Command *parse_command(Instance_map *map, const char *text) Abstract_option_cmd *cmd; if (tok1 == TOK_SET) - cmd= new Set_option(map); + cmd= new Set_option(); else - cmd= new Unset_option(map); + cmd= new Unset_option(); if (!cmd) return NULL; /* Report ER_OUT_OF_RESOURCES. */ @@ -371,7 +371,7 @@ Command *parse_command(Instance_map *map, const char *text) get_word(&text, &word_len, NONSPACE); if (word_len) goto syntax_error; - command= new Show_instances(map); + command= new Show_instances(); break; case TOK_INSTANCE: switch (Token tok2= shift_token(&text, &word_len)) { @@ -385,9 +385,9 @@ Command *parse_command(Instance_map *map, const char *text) if (word_len) goto syntax_error; if (tok2 == TOK_STATUS) - command= new Show_instance_status(map, &instance_name); + command= new Show_instance_status(&instance_name); else - command= new Show_instance_options(map, &instance_name); + command= new Show_instance_options(&instance_name); break; default: goto syntax_error; @@ -414,7 +414,7 @@ Command *parse_command(Instance_map *map, const char *text) /* check that this is the end of the command */ if (word_len) goto syntax_error; - command= new Show_instance_log_files(map, &instance_name); + command= new Show_instance_log_files(&instance_name); break; case TOK_ERROR: case TOK_GENERAL: @@ -484,7 +484,7 @@ Command *parse_command(Instance_map *map, const char *text) goto syntax_error; } - command= new Show_instance_log(map, &instance_name, + command= new Show_instance_log(&instance_name, log_type, log_size, log_offset); break; default: @@ -504,5 +504,8 @@ Command *parse_command(Instance_map *map, const char *text) syntax_error: command= new Syntax_error(); } + + DBUG_ASSERT(command); + return command; } diff --git a/server-tools/instance-manager/parse.h b/server-tools/instance-manager/parse.h index fd970f54d29..7e954b4918f 100644 --- a/server-tools/instance-manager/parse.h +++ b/server-tools/instance-manager/parse.h @@ -21,7 +21,6 @@ #include <m_string.h> class Command; -class Instance_map; enum Log_type { @@ -30,7 +29,7 @@ enum Log_type IM_LOG_SLOW }; -Command *parse_command(Instance_map *map, const char *text); +Command *parse_command(const char *text); bool parse_option_value(const char *text, uint *text_len, char **value); diff --git a/server-tools/instance-manager/priv.cc b/server-tools/instance-manager/priv.cc index 3dae900d84b..7e3553444ac 100644 --- a/server-tools/instance-manager/priv.cc +++ b/server-tools/instance-manager/priv.cc @@ -18,6 +18,9 @@ #include <my_global.h> #include <mysql_com.h> +#include <my_sys.h> + +#include "log.h" #if defined(__ia64__) || defined(__ia64) /* @@ -90,3 +93,32 @@ int set_stacksize_n_create_thread(pthread_t *thread, pthread_attr_t *attr, rc= pthread_create(thread, attr, start_routine, arg); return rc; } + + +int create_pid_file(const char *pid_file_name, int pid) +{ + FILE *pid_file; + + if (!(pid_file= my_fopen(pid_file_name, O_WRONLY | O_CREAT | O_BINARY, + MYF(0)))) + { + log_error("Error: can not create pid file '%s': %s (errno: %d)", + (const char *) pid_file_name, + (const char *) strerror(errno), + (int) errno); + return 1; + } + + if (fprintf(pid_file, "%d\n", (int) pid) <= 0) + { + log_error("Error: can not write to pid file '%s': %s (errno: %d)", + (const char *) pid_file_name, + (const char *) strerror(errno), + (int) errno); + return 1; + } + + my_fclose(pid_file, MYF(0)); + + return 0; +} diff --git a/server-tools/instance-manager/priv.h b/server-tools/instance-manager/priv.h index 0b393c17ac2..33be81bc3eb 100644 --- a/server-tools/instance-manager/priv.h +++ b/server-tools/instance-manager/priv.h @@ -109,4 +109,6 @@ extern unsigned long open_files_limit; int set_stacksize_n_create_thread(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg); +int create_pid_file(const char *pid_file_name, int pid); + #endif // INCLUDES_MYSQL_INSTANCE_MANAGER_PRIV_H diff --git a/server-tools/instance-manager/thread_registry.h b/server-tools/instance-manager/thread_registry.h index 503d24e5fb0..3af7c8e0240 100644 --- a/server-tools/instance-manager/thread_registry.h +++ b/server-tools/instance-manager/thread_registry.h @@ -101,6 +101,7 @@ public: pthread_mutex_t *mutex); int cond_timedwait(Thread_info *info, pthread_cond_t *cond, pthread_mutex_t *mutex, struct timespec *wait_time); + private: void interrupt_threads(); void wait_for_threads_to_unregister(); @@ -111,6 +112,10 @@ private: pthread_mutex_t LOCK_thread_registry; pthread_cond_t COND_thread_registry_is_empty; pthread_t sigwait_thread_pid; + +private: + Thread_registry(const Thread_registry &); + Thread_registry &operator =(const Thread_registry &); }; diff --git a/server-tools/instance-manager/user_map.cc b/server-tools/instance-manager/user_map.cc index c1439e983d8..a3a02e89b73 100644 --- a/server-tools/instance-manager/user_map.cc +++ b/server-tools/instance-manager/user_map.cc @@ -42,7 +42,7 @@ int User::init(const char *line) if (name_end == 0 || name_end[1] != ':') { log_info("Error: invalid format (unmatched quote) of user line (%s).", - (const char *) line); + (const char *) line); return 1; } password= name_end + 2; @@ -54,7 +54,7 @@ int User::init(const char *line) if (name_end == 0) { log_info("Error: invalid format (no delimiter) of user line (%s).", - (const char *) line); + (const char *) line); return 1; } password= name_end + 1; @@ -64,17 +64,18 @@ int User::init(const char *line) if (user_length > USERNAME_LENGTH) { log_info("Error: user name is too long (%d). Max length: %d. " - "User line: '%s'.", - (int) user_length, - (int) USERNAME_LENGTH, - (const char *) line); + "User line: '%s'.", + (int) user_length, + (int) USERNAME_LENGTH, + (const char *) line); return 1; } password_length= strlen(password); if (password_length > SCRAMBLED_PASSWORD_CHAR_LENGTH) { - log_info("Error: password is too long (%d). Max length: %d. User line: '%s'.", + log_info("Error: password is too long (%d). Max length: %d." + "User line: '%s'.", (int) password_length, (int) SCRAMBLED_PASSWORD_CHAR_LENGTH, line); |