}
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);
// 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;
{
}
}
- 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();
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;
// 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;
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()
{
}
*/
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
*/
/// 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);
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 = "";
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);
}
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,
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);
#include <stdint.h>
#include <vector>
+#include <map>
#include <boost/intrusive_ptr.hpp>
#include "include/assert.h"
#include "common/code_environment.h"
* 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);
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);
}
/* 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);
// 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);
// 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);
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);
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);
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;
#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);