summaryrefslogtreecommitdiff
path: root/server-tools
diff options
context:
space:
mode:
Diffstat (limited to 'server-tools')
-rw-r--r--server-tools/instance-manager/IMService.cpp10
-rw-r--r--server-tools/instance-manager/Makefile.am2
-rw-r--r--server-tools/instance-manager/command.cc6
-rw-r--r--server-tools/instance-manager/command.h4
-rw-r--r--server-tools/instance-manager/commands.cc63
-rw-r--r--server-tools/instance-manager/commands.h46
-rw-r--r--server-tools/instance-manager/guardian.cc42
-rw-r--r--server-tools/instance-manager/guardian.h16
-rw-r--r--server-tools/instance-manager/instance_map.cc4
-rw-r--r--server-tools/instance-manager/instance_map.h6
-rw-r--r--server-tools/instance-manager/manager.cc78
-rw-r--r--server-tools/instance-manager/manager.h25
-rw-r--r--server-tools/instance-manager/mysql_connection.cc6
-rw-r--r--server-tools/instance-manager/mysqlmanager.cc9
-rw-r--r--server-tools/instance-manager/parse.cc29
-rw-r--r--server-tools/instance-manager/parse.h3
-rw-r--r--server-tools/instance-manager/priv.cc32
-rw-r--r--server-tools/instance-manager/priv.h2
-rw-r--r--server-tools/instance-manager/thread_registry.h5
-rw-r--r--server-tools/instance-manager/user_map.cc15
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);