summaryrefslogtreecommitdiff
path: root/server-tools
diff options
context:
space:
mode:
authorunknown <petr@mysql.com>2005-07-21 14:21:23 +0400
committerunknown <petr@mysql.com>2005-07-21 14:21:23 +0400
commit34fa3be594434bae844c087f7a79bca5103b758f (patch)
tree29261f504adad5b9145e9497ef5c680c3da1d3fe /server-tools
parent15413296d85b31d518255c4ea1cab84618a99f3f (diff)
downloadmariadb-git-34fa3be594434bae844c087f7a79bca5103b758f.tar.gz
WL #2713 Change IM behaviour so, that it only reads and alters one config file only.
Implemented on brian's request. server-tools/instance-manager/Makefile.am: define default config file server-tools/instance-manager/commands.cc: Use specified or default file to edit with SET commands instead of hardcoded file server-tools/instance-manager/commands.h: add member to SET commands server-tools/instance-manager/instance_map.cc: rename first_option -> single_defaults_option, made logging a bit more verbose server-tools/instance-manager/instance_map.h: rename first_option -> single_defaults_file + made it public server-tools/instance-manager/manager.cc: rename first_option -> single_defaults_file server-tools/instance-manager/mysqlmanager.cc: goto generic error label instead of simple return server-tools/instance-manager/options.cc: skip --defaults-extra file and give a message if it was specified, made IM to read one config file only server-tools/instance-manager/options.h: added new members to the option structure
Diffstat (limited to 'server-tools')
-rw-r--r--server-tools/instance-manager/Makefile.am1
-rw-r--r--server-tools/instance-manager/commands.cc30
-rw-r--r--server-tools/instance-manager/commands.h1
-rw-r--r--server-tools/instance-manager/instance_map.cc27
-rw-r--r--server-tools/instance-manager/instance_map.h4
-rw-r--r--server-tools/instance-manager/manager.cc3
-rw-r--r--server-tools/instance-manager/mysqlmanager.cc2
-rw-r--r--server-tools/instance-manager/options.cc65
-rw-r--r--server-tools/instance-manager/options.h4
9 files changed, 105 insertions, 32 deletions
diff --git a/server-tools/instance-manager/Makefile.am b/server-tools/instance-manager/Makefile.am
index 2788aef8f82..68c9d5b7d18 100644
--- a/server-tools/instance-manager/Makefile.am
+++ b/server-tools/instance-manager/Makefile.am
@@ -34,6 +34,7 @@ liboptions_a_CXXFLAGS= $(CXXFLAGS) \
-DDEFAULT_MYSQLD_PATH="$(libexecdir)/mysqld$(EXEEXT)" \
-DDEFAULT_MONITORING_INTERVAL="20" \
-DDEFAULT_PORT="2273" \
+ -DDEFAULT_CONFIG_FILE="/etc/my.cnf" \
-DPROTOCOL_VERSION=@PROTOCOL_VERSION@
liboptions_a_SOURCES= options.h options.cc priv.h priv.cc
diff --git a/server-tools/instance-manager/commands.cc b/server-tools/instance-manager/commands.cc
index 2357f97fd93..885233ca13c 100644
--- a/server-tools/instance-manager/commands.cc
+++ b/server-tools/instance-manager/commands.cc
@@ -22,6 +22,7 @@
#include "mysql_manager_error.h"
#include "protocol.h"
#include "buffer.h"
+#include "options.h"
#include <m_string.h>
#include <mysql.h>
@@ -643,6 +644,12 @@ Set_option::Set_option(Instance_map *instance_map_arg,
if ((instance= instance_map->find(name, len)))
{
instance_name= instance->options.instance_name;
+ if (instance_map->single_defaults_file_option != NULL)
+ single_defaults_file=
+ strchr(instance_map->single_defaults_file_option, '=') + 1;
+ else
+ single_defaults_file= NULL;
+
/* add prefix for add_option */
if ((option_len_arg < MAX_OPTION_LEN - 1) ||
(option_value_len_arg < MAX_OPTION_LEN - 1))
@@ -689,15 +696,26 @@ int Set_option::correct_file(int skip)
{
int error;
- error= modify_defaults_file("/etc/my.cnf", option,
- option_value, instance_name, skip);
- if (error > 0)
+ if (single_defaults_file != NULL)
+ error= modify_defaults_file(single_defaults_file, option,
+ option_value, instance_name, skip);
+ else
+ error= modify_defaults_file(Options::default_config_file, option,
+ option_value, instance_name, skip);
+
+ switch (error)
+ {
+ case 0:
+ return 0; /* everything was fine */
+ case 1:
return ER_OUT_OF_RESOURCES;
- else if (error < 0)
+ case 2:
return ER_ACCESS_OPTION_FILE;
+ default:
+ DBUG_ASSERT(0); /* should never get here */
+ }
- /* everything was fine */
- return 0;
+ return 0; /* keep compiler happy */
}
diff --git a/server-tools/instance-manager/commands.h b/server-tools/instance-manager/commands.h
index bfd38d34889..7681b28aba5 100644
--- a/server-tools/instance-manager/commands.h
+++ b/server-tools/instance-manager/commands.h
@@ -187,6 +187,7 @@ protected:
public:
const char *instance_name;
uint instance_name_len;
+ const char *single_defaults_file;
/* buffer for the option */
enum { MAX_OPTION_LEN= 1024 };
char option[MAX_OPTION_LEN];
diff --git a/server-tools/instance-manager/instance_map.cc b/server-tools/instance-manager/instance_map.cc
index fa8a5d58114..cee8ba5a92d 100644
--- a/server-tools/instance-manager/instance_map.cc
+++ b/server-tools/instance-manager/instance_map.cc
@@ -22,6 +22,8 @@
#include "buffer.h"
#include "instance.h"
+#include "log.h"
+#include "options.h"
#include <m_ctype.h>
#include <mysql_com.h>
@@ -112,8 +114,9 @@ C_MODE_END
Instance_map::Instance_map(const char *default_mysqld_path_arg,
- const char *first_option_arg):
-mysqld_path(default_mysqld_path_arg), first_option(first_option_arg)
+ const char *single_defaults_file_option_arg):
+mysqld_path(default_mysqld_path_arg),
+single_defaults_file_option(single_defaults_file_option_arg)
{
pthread_mutex_init(&LOCK_instance_map, 0);
}
@@ -202,7 +205,8 @@ int Instance_map::complete_initialization()
hash_free should handle it's deletion => goto err, not
err_instance.
*/
- if (instance->complete_initialization(this, mysqld_path, DEFAULT_SINGLE_INSTANCE))
+ if (instance->complete_initialization(this, mysqld_path,
+ DEFAULT_SINGLE_INSTANCE))
goto err;
}
else
@@ -236,18 +240,25 @@ int Instance_map::load()
/* the name of the program may be orbitrary here in fact */
argv_options[0]= "mysqlmanager";
- if (first_option != NULL)
+ if (single_defaults_file_option != NULL)
{
argc= 2;
- argv_options[1]= first_option;
+ argv_options[1]= single_defaults_file_option;
argv_options[2]= '\0';
}
else
argv_options[1]= '\0';
- if (my_search_option_files("my", &argc, (char ***) &argv, &args_used,
- process_option, (void*) this) ||
- complete_initialization())
+ /*
+ If the routine failed, we'll simply fallback to defaults in
+ complete_initialization().
+ */
+ if (my_search_option_files(Options::default_config_file, &argc,
+ (char ***) &argv, &args_used,
+ process_option, (void*) this))
+ log_info("Falling back to compiled-in defaults");
+
+ if (complete_initialization())
return 1;
return 0;
diff --git a/server-tools/instance-manager/instance_map.h b/server-tools/instance-manager/instance_map.h
index 46247c82a16..84855712be5 100644
--- a/server-tools/instance-manager/instance_map.h
+++ b/server-tools/instance-manager/instance_map.h
@@ -65,7 +65,7 @@ public:
int init();
Instance_map(const char *default_mysqld_path_arg,
- const char *first_option_arg);
+ const char *single_defaults_file_option_arg);
~Instance_map();
/* loads options from config files */
@@ -77,10 +77,10 @@ public:
public:
const char *mysqld_path;
+ const char *single_defaults_file_option;
Guardian_thread *guardian;
private:
- const char *first_option;
enum { START_HASH_SIZE = 16 };
pthread_mutex_t LOCK_instance_map;
HASH hash;
diff --git a/server-tools/instance-manager/manager.cc b/server-tools/instance-manager/manager.cc
index a4c81739b17..df854227c8e 100644
--- a/server-tools/instance-manager/manager.cc
+++ b/server-tools/instance-manager/manager.cc
@@ -68,7 +68,8 @@ void manager(const Options &options)
*/
User_map user_map;
- Instance_map instance_map(options.default_mysqld_path, options.first_option);
+ Instance_map instance_map(options.default_mysqld_path,
+ options.single_defaults_file_option);
Guardian_thread guardian_thread(thread_registry,
&instance_map,
options.monitoring_interval);
diff --git a/server-tools/instance-manager/mysqlmanager.cc b/server-tools/instance-manager/mysqlmanager.cc
index 5a6c398614b..8693b3c590f 100644
--- a/server-tools/instance-manager/mysqlmanager.cc
+++ b/server-tools/instance-manager/mysqlmanager.cc
@@ -83,7 +83,7 @@ int main(int argc, char *argv[])
if (set_user(options.user, user_info))
{
options.cleanup();
- return 1;
+ goto err;
}
}
diff --git a/server-tools/instance-manager/options.cc b/server-tools/instance-manager/options.cc
index e44e4c6ff34..6fad798b49a 100644
--- a/server-tools/instance-manager/options.cc
+++ b/server-tools/instance-manager/options.cc
@@ -36,7 +36,8 @@ const char *Options::pid_file_name= QUOTE(DEFAULT_PID_FILE_NAME);
const char *Options::socket_file_name= QUOTE(DEFAULT_SOCKET_FILE_NAME);
const char *Options::password_file_name= QUOTE(DEFAULT_PASSWORD_FILE_NAME);
const char *Options::default_mysqld_path= QUOTE(DEFAULT_MYSQLD_PATH);
-const char *Options::first_option= 0; /* No default value */
+const char *Options::default_config_file= QUOTE(DEFAULT_CONFIG_FILE);
+const char *Options::single_defaults_file_option= 0; /* No default value */
const char *Options::bind_address= 0; /* No default value */
const char *Options::user= 0; /* No default value */
uint Options::monitoring_interval= DEFAULT_MONITORING_INTERVAL;
@@ -204,31 +205,69 @@ C_MODE_END
/*
- - call load_defaults to load configuration file section
+ - Process argv of original program: get tid of --defaults-extra-file
+ and print a message if met there.
+ - call load_defaults to load configuration file section and save the pointer
+ for free_defaults.
- call handle_options to assign defaults and command-line arguments
- to the class members
- if either of these function fail, exit the program
- May not return.
+ to the class members.
+ if either of these function fail, return the error code.
*/
int Options::load(int argc, char **argv)
{
int rc;
+ char **original_argv;
+ int original_argc;
+ char *original_argv_buff[1024];
+ int use_new_argv= 0;
- if (argc >= 2)
+ saved_argv= argv;
+ original_argv= original_argv_buff;
+ original_argc= argc;
+
+ if (argc >= 2 && is_prefix(argv[1],"--defaults-file="))
{
- if (is_prefix(argv[1],"--defaults-file=") ||
- is_prefix(argv[1],"--defaults-extra-file="))
- Options::first_option= argv[1];
+ if (is_prefix(argv[1],"--defaults-file="))
+ {
+ /* set --defaults-file, so that we read only this file */
+ Options::single_defaults_file_option= argv[1];
+ }
+ if (is_prefix(argv[1],"--defaults-extra-file="))
+ {
+ int argv_pos= 1;
+
+ original_argv[0]= argv[0];
+ use_new_argv= 1;
+ /* skip --defaullts-extra-file */
+ while (++argv_pos != argc)
+ original_argv[argv_pos]=argv[argv_pos];
+ original_argv[argv_pos]= 0;
+ /* the log is not enabled yet */
+ fprintf(stderr, "--defaults-extra-file is not supported by IM."
+ " Skipping the option. \n");
+ original_argc--;
+ }
}
+ /* here load_defaults will save pointer to free allocated memory */
+ if (use_new_argv)
+ saved_argv= original_argv;
+ else
+ saved_argv= argv;
+
/* config-file options are prepended to command-line ones */
- load_defaults("my", default_groups, &argc, &argv);
- Options::saved_argv= argv;
+ load_defaults(default_config_file, default_groups, &original_argc,
+ &saved_argv);
+
+ if ((rc= handle_options(&original_argc, &saved_argv, my_long_options,
+ get_one_option)) != 0)
+ goto err;
- if ((rc= handle_options(&argc, &argv, my_long_options, get_one_option)) != 0)
- return rc;
return 0;
+
+err:
+ return rc;
}
void Options::cleanup()
diff --git a/server-tools/instance-manager/options.h b/server-tools/instance-manager/options.h
index 3df259864be..de9a61c2de3 100644
--- a/server-tools/instance-manager/options.h
+++ b/server-tools/instance-manager/options.h
@@ -36,11 +36,13 @@ struct Options
static const char *default_mysqld_path;
static const char *user;
/* the option which should be passed to process_default_option_files */
- static const char *first_option;
+ static const char *single_defaults_file_option;
static uint monitoring_interval;
static uint port_number;
static const char *bind_address;
+ static const char *default_config_file;
+ /* argv pointer returned by load_defaults() to be used by free_defaults() */
static char **saved_argv;
static int load(int argc, char **argv);