]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
common: refactor default config value handling
authorSage Weil <sage@redhat.com>
Mon, 13 Nov 2017 15:27:00 +0000 (09:27 -0600)
committerSage Weil <sage@redhat.com>
Tue, 6 Mar 2018 20:44:10 +0000 (14:44 -0600)
- pass an optional map<string,string> instead of an arg list
- remember default values in md_config_t
- some nicer helpers

Signed-off-by: Sage Weil <sage@redhat.com>
14 files changed:
src/ceph_fuse.cc
src/ceph_mon.cc
src/ceph_osd.cc
src/common/common_init.cc
src/common/config.cc
src/common/config.h
src/global/global_init.cc
src/global/global_init.h
src/rgw/librgw.cc
src/rgw/rgw_main.cc
src/test/crush/CrushWrapper.cc
src/test/objectstore/test_bluefs.cc
src/test/objectstore/test_memstore_clone.cc
src/test/perf_counters.cc

index 05a4f3f9da9219e35ab410399ec4f64e256ad56a..35e3509bf7021312338d6b9e48f8459106e7dd88 100644 (file)
@@ -79,9 +79,11 @@ int main(int argc, const char **argv, const char *envp[]) {
   }
   env_to_vec(args);
 
-  std::vector<const char*> def_args{"--pid-file="};
+  std::map<std::string,std::string> 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);
 
index 63d7e84124433636be5f15ba66f3f8e3b5112e6c..8683000af9cd3ab62aeb6fb45659dcb906afac15 100644 (file)
@@ -214,12 +214,13 @@ int main(int argc, const char **argv)
   //  leveldb_block_size        = 64*1024       = 65536     // 64KB
   //  leveldb_compression       = false
   //  leveldb_log               = ""
-  vector<const char*> 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<string,string> 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();
index d9f4f0a3fcccf9f5e54607f67ec695050a581e14..c7f887ae87a6c8ab0ef5345db8dd30a884d99d17 100644 (file)
@@ -112,14 +112,16 @@ int main(int argc, const char **argv)
   argv_to_vec(argc, argv, args);
   env_to_vec(args);
 
-  vector<const char*> 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<string,string> 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;
index 5b37962f9b1db09e6f1510ffe457ab0a2195c4cd..3042b612940956d3b5332a16f0bec387859b6893 100644 (file)
@@ -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;
index e76120963f176ea0b9a0bf1ee2b63e7152d85374..6639ea12b6f5c2c7972bbf3fc36f84c5643fa7ac 100644 (file)
@@ -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<boost::blank>(&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<std::string>(&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()
 {
 }
index 0b0d670d23da8068563728441904f70b5c4626d5..51c7a10e5457ee32402634540b8a4c2bbad1a974 100644 (file)
@@ -86,6 +86,9 @@ public:
    */
   std::map<std::string, const Option&> schema;
 
+  /// default values (if they vary from the schema)
+  std::map<std::string, Option::value_t> 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);
 
index 9855f370882fc3fb72c05af6c5218aef87f277d4..daaaf955668ae1ab8c9dcfe1207121e1efbb5fc4 100644 (file)
@@ -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<std::string,std::string> *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<CephContext>
-global_init(std::vector < const char * > *alt_def_args,
+global_init(const std::map<std::string,std::string> *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);
index 3ef7647cdd3f0d1763e2490911b32d1f3ad1bb12..2c4bf2ebbc63da4d958d90986409ff5ad10e8e58 100644 (file)
@@ -17,6 +17,7 @@
 
 #include <stdint.h>
 #include <vector>
+#include <map>
 #include <boost/intrusive_ptr.hpp>
 #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<CephContext>
-     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<std::string,std::string> *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<std::string,std::string> *defaults,
                     std::vector < const char* >& args,
                     uint32_t module_type, code_environment_t code_env,
                     int flags);
index fae69aeed9f39097675fa7f1952d289d0d7e7613..4920d0650c0a1a57a59a3b24e2b1d1a6c52aef2b 100644 (file)
@@ -465,12 +465,13 @@ namespace rgw {
     int r = 0;
 
     /* alternative default for module */
-    vector<const char *> 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<string,string> 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);
index 97b3354b30a1191df6622721536cb37af341fef9..b8d1aee5d63290d239797359797daa18efc5b378 100644 (file)
@@ -183,9 +183,10 @@ int main(int argc, const char **argv)
   }
 
   /* alternative default for module */
-  vector<const char *> def_args;
-  def_args.push_back("--debug-rgw=1/5");
-  def_args.push_back("--keyring=$rgw_data/keyring");
+  map<string,string> defaults = {
+    { "debug_rgw", "1/5" },
+    { "keyring", "$rgw_data/keyring" }
+  };
 
   vector<const char*> 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<string> 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);
 
index d13b1b06cd1c91dab6b744396fa90ae74f85c539..c5d81bc7e0680b727493fd4e50efefefbb79111d 100644 (file)
@@ -1423,9 +1423,10 @@ int main(int argc, char **argv) {
   argv_to_vec(argc, (const char **)argv, args);
   env_to_vec(args);
 
-  vector<const char*> def_args;
-  def_args.push_back("--debug-crush=0");
-  auto cct = global_init(&def_args, args, CEPH_ENTITY_TYPE_CLIENT,
+  map<string,string> 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);
index 0b2f2df70197637242066e068bb7934374dde83d..da5fbad683fdc8ffff441f93f76d704dc47ec6fa 100644 (file)
@@ -572,11 +572,12 @@ int main(int argc, char **argv) {
   argv_to_vec(argc, (const char **)argv, args);
   env_to_vec(args);
 
-  vector<const char *> def_args;
-  def_args.push_back("--debug-bluefs=1/20");
-  def_args.push_back("--debug-bdev=1/20");
+  map<string,string> 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);
index adf07cdb9489b2c73307ecaa7337e03ad6145bf8..15ca2d8b859439fba8bad150c86f5610a80e3b7f 100644 (file)
@@ -183,10 +183,10 @@ TEST_F(MemStoreClone, CloneRangeHoleEnd)
 int main(int argc, char** argv)
 {
   // default to memstore
-  vector<const char*> defaults{
-    "--osd_objectstore", "memstore",
-    "--osd_data", "msc.test_temp_dir",
-    "--memstore_page_size", "4",
+  map<string,string> defaults = {
+    { "osd_objectstore", "memstore" },
+    { "osd_data", "msc.test_temp_dir" },
+    { "memstore_page_size", "4" }
   };
 
   vector<const char*> args;
index 362d11b89c954a4af73a4e119465ec43821c2575..87ce7163cdeadb61570b08ce795dd736d88a5cdb 100644 (file)
 #include "common/common_init.h"
 
 int main(int argc, char **argv) {
-  std::vector<const char *> preargs;
-  preargs.push_back("--admin-socket");
-  preargs.push_back(get_rand_socket_path());
+  map<string,string> defaults = {
+    { "admin_socket", get_rand_socket_path() }
+  };
   std::vector<const char*> 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);