diff options
author | unknown <petr@mysql.com> | 2005-07-21 14:21:23 +0400 |
---|---|---|
committer | unknown <petr@mysql.com> | 2005-07-21 14:21:23 +0400 |
commit | 34fa3be594434bae844c087f7a79bca5103b758f (patch) | |
tree | 29261f504adad5b9145e9497ef5c680c3da1d3fe /server-tools | |
parent | 15413296d85b31d518255c4ea1cab84618a99f3f (diff) | |
download | mariadb-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.am | 1 | ||||
-rw-r--r-- | server-tools/instance-manager/commands.cc | 30 | ||||
-rw-r--r-- | server-tools/instance-manager/commands.h | 1 | ||||
-rw-r--r-- | server-tools/instance-manager/instance_map.cc | 27 | ||||
-rw-r--r-- | server-tools/instance-manager/instance_map.h | 4 | ||||
-rw-r--r-- | server-tools/instance-manager/manager.cc | 3 | ||||
-rw-r--r-- | server-tools/instance-manager/mysqlmanager.cc | 2 | ||||
-rw-r--r-- | server-tools/instance-manager/options.cc | 65 | ||||
-rw-r--r-- | server-tools/instance-manager/options.h | 4 |
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); |