From db655f800a7fcf50a1707b6708b592ff50f9663d Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 13 Nov 2017 09:27:00 -0600 Subject: [PATCH] common: refactor default config value handling - pass an optional map instead of an arg list - remember default values in md_config_t - some nicer helpers Signed-off-by: Sage Weil --- src/ceph_fuse.cc | 6 ++- src/ceph_mon.cc | 15 +++--- src/ceph_osd.cc | 18 ++++---- src/common/common_init.cc | 12 ++--- src/common/config.cc | 51 +++++++++++++++++++++ src/common/config.h | 12 +++++ src/global/global_init.cc | 21 +++++---- src/global/global_init.h | 18 ++++---- src/rgw/librgw.cc | 11 +++-- src/rgw/rgw_main.cc | 14 +++--- src/test/crush/CrushWrapper.cc | 7 +-- src/test/objectstore/test_bluefs.cc | 9 ++-- src/test/objectstore/test_memstore_clone.cc | 8 ++-- src/test/perf_counters.cc | 8 ++-- 14 files changed, 145 insertions(+), 65 deletions(-) diff --git a/src/ceph_fuse.cc b/src/ceph_fuse.cc index 05a4f3f9da9..35e3509bf70 100644 --- a/src/ceph_fuse.cc +++ b/src/ceph_fuse.cc @@ -79,9 +79,11 @@ int main(int argc, const char **argv, const char *envp[]) { } env_to_vec(args); - std::vector def_args{"--pid-file="}; + std::map defaults = { + { "pid_file", "" } + }; - auto cct = global_init(&def_args, args, CEPH_ENTITY_TYPE_CLIENT, + auto cct = global_init(&defaults, args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_DAEMON, CINIT_FLAG_UNPRIVILEGED_DAEMON_DEFAULTS); diff --git a/src/ceph_mon.cc b/src/ceph_mon.cc index 63d7e841244..8683000af9c 100644 --- a/src/ceph_mon.cc +++ b/src/ceph_mon.cc @@ -214,12 +214,13 @@ int main(int argc, const char **argv) // leveldb_block_size = 64*1024 = 65536 // 64KB // leveldb_compression = false // leveldb_log = "" - vector def_args; - def_args.push_back("--leveldb-write-buffer-size=33554432"); - def_args.push_back("--leveldb-cache-size=536870912"); - def_args.push_back("--leveldb-block-size=65536"); - def_args.push_back("--leveldb-compression=false"); - def_args.push_back("--leveldb-log="); + map defaults = { + { "leveldb_write_buffer_size", "33554432" }, + { "leveldb_cache_size", "536870912" }, + { "leveldb_block_size", "65536" }, + { "leveldb_compression", "false"}, + { "leveldb_log", "" } + }; int flags = 0; { @@ -241,7 +242,7 @@ int main(int argc, const char **argv) } } - auto cct = global_init(&def_args, args, + auto cct = global_init(&defaults, args, CEPH_ENTITY_TYPE_MON, CODE_ENVIRONMENT_DAEMON, flags, "mon_data"); ceph_heap_profiler_init(); diff --git a/src/ceph_osd.cc b/src/ceph_osd.cc index d9f4f0a3fcc..c7f887ae87a 100644 --- a/src/ceph_osd.cc +++ b/src/ceph_osd.cc @@ -112,14 +112,16 @@ int main(int argc, const char **argv) argv_to_vec(argc, argv, args); env_to_vec(args); - vector def_args; - // We want to enable leveldb's log, while allowing users to override this - // option, therefore we will pass it as a default argument to global_init(). - def_args.push_back("--leveldb-log="); - - auto cct = global_init(&def_args, args, CEPH_ENTITY_TYPE_OSD, - CODE_ENVIRONMENT_DAEMON, - 0, "osd_data"); + map defaults = { + // We want to enable leveldb's log, while allowing users to override this + // option, therefore we will pass it as a default argument to global_init(). + { "leveldb_log", "" } + }; + auto cct = global_init( + &defaults, + args, CEPH_ENTITY_TYPE_OSD, + CODE_ENVIRONMENT_DAEMON, + 0, "osd_data"); ceph_heap_profiler_init(); Preforker forker; diff --git a/src/common/common_init.cc b/src/common/common_init.cc index 5b37962f9b1..3042b612940 100644 --- a/src/common/common_init.cc +++ b/src/common/common_init.cc @@ -46,20 +46,20 @@ CephContext *common_preinit(const CephInitParameters &iparams, // for backward compatibility. moving forward, we want all keyrings // in these locations. the mon already forces $mon_data/keyring. if (conf->name.is_mds()) { - conf->set_val("keyring", "$mds_data/keyring", false); + conf->set_val_default("keyring", "$mds_data/keyring"); } else if (conf->name.is_osd()) { - conf->set_val("keyring", "$osd_data/keyring", false); + conf->set_val_default("keyring", "$osd_data/keyring"); } if (code_env == CODE_ENVIRONMENT_LIBRARY || code_env == CODE_ENVIRONMENT_UTILITY_NODOUT) { - conf->set_val_or_die("log_to_stderr", "false"); - conf->set_val_or_die("err_to_stderr", "false"); - conf->set_val_or_die("log_flush_on_exit", "false"); + conf->set_val_default("log_to_stderr", "false"); + conf->set_val_default("err_to_stderr", "false"); + conf->set_val_default("log_flush_on_exit", "false"); } if (code_env != CODE_ENVIRONMENT_DAEMON) { // NOTE: disable ms subsystem gathering in clients by default - conf->set_val_or_die("debug_ms", "0/0"); + conf->set_val_default("debug_ms", "0/0"); } return cct; diff --git a/src/common/config.cc b/src/common/config.cc index e76120963f1..6639ea12b6f 100644 --- a/src/common/config.cc +++ b/src/common/config.cc @@ -227,6 +227,57 @@ const Option *md_config_t::find_option(const string& name) const return nullptr; } +Option::value_t md_config_t::get_val_default( + const string& name, + bool meta) const +{ + Mutex::Locker l(lock); + const Option *o = find_option(name); + return _get_val_default(*o, meta); +} + +Option::value_t md_config_t::_get_val_default(const Option& o, bool meta) const +{ + Option::value_t v; + + auto p = default_values.find(o.name); + if (p != default_values.end()) { + // custom default + v = p->second; + } else { + // schema default + bool has_daemon_default = !boost::get(&o.daemon_value); + if (is_daemon && has_daemon_default) { + v = o.daemon_value; + } else { + v = o.value; + } + } + + if (meta) { + // expand meta fields + string *s = boost::get(&v); + if (s) { + ostringstream oss; + expand_meta(*s, &oss); + } + } + return v; +} + +void md_config_t::set_val_default(const string& name, const std::string& val) +{ + Mutex::Locker l(lock); + const Option *o = find_option(name); + assert(o); + string err; + Option::value_t v; + int r = o->parse_value(val, &v, &err); + assert(r == 0); + values[name] = v; + default_values[name] = v; +} + md_config_t::~md_config_t() { } diff --git a/src/common/config.h b/src/common/config.h index 0b0d670d23d..51c7a10e545 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -86,6 +86,9 @@ public: */ std::map schema; + /// default values (if they vary from the schema) + std::map default_values; + /** * The current values of all settings described by the schema */ @@ -139,6 +142,15 @@ public: /// Look up an option in the schema const Option *find_option(const string& name) const; + /// Look up the default value for an option by name + Option::value_t get_val_default(const string& name, bool meta) const; + + /// Look up the default value for an option + Option::value_t _get_val_default(const Option& o, bool meta) const; + + /// Set a default value + void set_val_default(const std::string& key, const std::string &val); + // Called by the Ceph daemons to make configuration changes at runtime int injectargs(const std::string &s, std::ostream *oss); diff --git a/src/global/global_init.cc b/src/global/global_init.cc index 9855f370882..daaaf955668 100644 --- a/src/global/global_init.cc +++ b/src/global/global_init.cc @@ -80,10 +80,11 @@ static int chown_path(const std::string &pathname, const uid_t owner, const gid_ return r; } -void global_pre_init(std::vector < const char * > *alt_def_args, - std::vector < const char* >& args, - uint32_t module_type, code_environment_t code_env, - int flags) +void global_pre_init( + const std::map *defaults, + std::vector < const char* >& args, + uint32_t module_type, code_environment_t code_env, + int flags) { std::string conf_file_list; std::string cluster = ""; @@ -94,8 +95,12 @@ void global_pre_init(std::vector < const char * > *alt_def_args, global_init_set_globals(cct); md_config_t *conf = cct->_conf; - if (alt_def_args) - conf->parse_argv(*alt_def_args); // alternative default args + // alternate defaults + if (defaults) { + for (auto& i : *defaults) { + conf->set_val_default(i.first, i.second); + } + } int ret = conf->parse_config_files(c_str_or_null(conf_file_list), &cerr, flags); @@ -130,7 +135,7 @@ void global_pre_init(std::vector < const char * > *alt_def_args, } boost::intrusive_ptr -global_init(std::vector < const char * > *alt_def_args, +global_init(const std::map *defaults, std::vector < const char* >& args, uint32_t module_type, code_environment_t code_env, int flags, @@ -141,7 +146,7 @@ global_init(std::vector < const char * > *alt_def_args, if (run_pre_init) { // We will run pre_init from here (default). assert(!g_ceph_context && first_run); - global_pre_init(alt_def_args, args, module_type, code_env, flags); + global_pre_init(defaults, args, module_type, code_env, flags); } else { // Caller should have invoked pre_init manually. assert(g_ceph_context && first_run); diff --git a/src/global/global_init.h b/src/global/global_init.h index 3ef7647cdd3..2c4bf2ebbc6 100644 --- a/src/global/global_init.h +++ b/src/global/global_init.h @@ -17,6 +17,7 @@ #include #include +#include #include #include "include/assert.h" #include "common/code_environment.h" @@ -30,20 +31,21 @@ class CephContext; * initialization, including setting up g_ceph_context. */ boost::intrusive_ptr - global_init(std::vector < const char * > *alt_def_args, - std::vector < const char* >& args, - uint32_t module_type, - code_environment_t code_env, - int flags, - const char *data_dir_option = 0, - bool run_pre_init = true); +global_init( + const std::map *defaults, + std::vector < const char* >& args, + uint32_t module_type, + code_environment_t code_env, + int flags, + const char *data_dir_option = 0, + bool run_pre_init = true); void intrusive_ptr_add_ref(CephContext* cct); void intrusive_ptr_release(CephContext* cct); // just the first half; enough to get config parsed but doesn't start up the // cct or log. -void global_pre_init(std::vector < const char * > *alt_def_args, +void global_pre_init(const std::map *defaults, std::vector < const char* >& args, uint32_t module_type, code_environment_t code_env, int flags); diff --git a/src/rgw/librgw.cc b/src/rgw/librgw.cc index fae69aeed9f..4920d0650c0 100644 --- a/src/rgw/librgw.cc +++ b/src/rgw/librgw.cc @@ -465,12 +465,13 @@ namespace rgw { int r = 0; /* alternative default for module */ - vector def_args; - def_args.push_back("--debug-rgw=1/5"); - def_args.push_back("--keyring=$rgw_data/keyring"); - def_args.push_back("--log-file=/var/log/radosgw/$cluster-$name.log"); + map defaults = { + { "debug_rgw", "1/5" }, + { "keyring", "$rgw_data/keyring" }, + { "log_file", "/var/log/radosgw/$cluster-$name.log" } + }; - cct = global_init(&def_args, args, + cct = global_init(&defaults, args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_DAEMON, CINIT_FLAG_UNPRIVILEGED_DAEMON_DEFAULTS); diff --git a/src/rgw/rgw_main.cc b/src/rgw/rgw_main.cc index 97b3354b30a..b8d1aee5d63 100644 --- a/src/rgw/rgw_main.cc +++ b/src/rgw/rgw_main.cc @@ -183,9 +183,10 @@ int main(int argc, const char **argv) } /* alternative default for module */ - vector def_args; - def_args.push_back("--debug-rgw=1/5"); - def_args.push_back("--keyring=$rgw_data/keyring"); + map defaults = { + { "debug_rgw", "1/5" }, + { "keyring", "$rgw_data/keyring" } + }; vector args; argv_to_vec(argc, argv, args); @@ -193,8 +194,9 @@ int main(int argc, const char **argv) // First, let's determine which frontends are configured. int flags = CINIT_FLAG_UNPRIVILEGED_DAEMON_DEFAULTS; - global_pre_init(&def_args, args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_DAEMON, - flags); + global_pre_init( + &defaults, args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_DAEMON, + flags); list frontends; g_conf->early_expand_meta(g_conf->rgw_frontends, &cerr); @@ -240,7 +242,7 @@ int main(int argc, const char **argv) // initialization. Passing false as the final argument ensures that // global_pre_init() is not invoked twice. // claim the reference and release it after subsequent destructors have fired - auto cct = global_init(&def_args, args, CEPH_ENTITY_TYPE_CLIENT, + auto cct = global_init(&defaults, args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_DAEMON, flags, "rgw_data", false); diff --git a/src/test/crush/CrushWrapper.cc b/src/test/crush/CrushWrapper.cc index d13b1b06cd1..c5d81bc7e06 100644 --- a/src/test/crush/CrushWrapper.cc +++ b/src/test/crush/CrushWrapper.cc @@ -1423,9 +1423,10 @@ int main(int argc, char **argv) { argv_to_vec(argc, (const char **)argv, args); env_to_vec(args); - vector def_args; - def_args.push_back("--debug-crush=0"); - auto cct = global_init(&def_args, args, CEPH_ENTITY_TYPE_CLIENT, + map defaults = { + { "debug_crush", "0" } + }; + auto cct = global_init(&defaults, args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0); common_init_finish(g_ceph_context); ::testing::InitGoogleTest(&argc, argv); diff --git a/src/test/objectstore/test_bluefs.cc b/src/test/objectstore/test_bluefs.cc index 0b2f2df7019..da5fbad683f 100644 --- a/src/test/objectstore/test_bluefs.cc +++ b/src/test/objectstore/test_bluefs.cc @@ -572,11 +572,12 @@ int main(int argc, char **argv) { argv_to_vec(argc, (const char **)argv, args); env_to_vec(args); - vector def_args; - def_args.push_back("--debug-bluefs=1/20"); - def_args.push_back("--debug-bdev=1/20"); + map defaults = { + { "debug_bluefs", "1/20" }, + { "debug_bdev", "1/20" } + }; - auto cct = global_init(&def_args, args, CEPH_ENTITY_TYPE_CLIENT, + auto cct = global_init(&defaults, args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0); common_init_finish(g_ceph_context); diff --git a/src/test/objectstore/test_memstore_clone.cc b/src/test/objectstore/test_memstore_clone.cc index adf07cdb948..15ca2d8b859 100644 --- a/src/test/objectstore/test_memstore_clone.cc +++ b/src/test/objectstore/test_memstore_clone.cc @@ -183,10 +183,10 @@ TEST_F(MemStoreClone, CloneRangeHoleEnd) int main(int argc, char** argv) { // default to memstore - vector defaults{ - "--osd_objectstore", "memstore", - "--osd_data", "msc.test_temp_dir", - "--memstore_page_size", "4", + map defaults = { + { "osd_objectstore", "memstore" }, + { "osd_data", "msc.test_temp_dir" }, + { "memstore_page_size", "4" } }; vector args; diff --git a/src/test/perf_counters.cc b/src/test/perf_counters.cc index 362d11b89c9..87ce7163cde 100644 --- a/src/test/perf_counters.cc +++ b/src/test/perf_counters.cc @@ -46,11 +46,11 @@ #include "common/common_init.h" int main(int argc, char **argv) { - std::vector preargs; - preargs.push_back("--admin-socket"); - preargs.push_back(get_rand_socket_path()); + map defaults = { + { "admin_socket", get_rand_socket_path() } + }; std::vector args; - auto cct = global_init(&preargs, args, CEPH_ENTITY_TYPE_CLIENT, + auto cct = global_init(&defaults, args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, CINIT_FLAG_NO_DEFAULT_CONFIG_FILE); common_init_finish(g_ceph_context); -- 2.39.5