// Trigger callbacks on any config observers that were waiting for
// it to become safe to start threads.
cct->_conf->set_val("internal_safe_to_start_threads", "true");
- cct->_conf->apply_changes();
+ cct->_conf->apply_changes(NULL);
}
void common_destroy_context(CephContext *cct)
* initialization happens here.
*/
#undef dout
+#undef ldout
#undef pdout
#undef derr
+#undef lderr
#undef generic_dout
#undef dendl
}
void md_config_t::
-apply_changes()
+apply_changes(std::ostringstream *oss)
{
/* Maps observers to the configuration options that they care about which
* have changed. */
// changed keys that they'll get.
rev_obs_map_t robs;
std::set <std::string> empty_set;
+ char buf[128];
+ char *bufptr = (char*)buf;
for (changed_set_t::const_iterator c = changed.begin();
c != changed.end(); ++c) {
const std::string &key(*c);
+ if ((oss) && (!get_val(key.c_str(), &bufptr, sizeof(buf)))) {
+ (*oss) << "applying configuration change: " << key << " = '"
+ << buf << "'\n";
+ }
pair < obs_map_t::iterator, obs_map_t::iterator >
range(observers.equal_range(key));
for (obs_map_t::iterator r = range.first; r != range.second; ++r) {
}
void md_config_t::
-injectargs(const std::string& s)
+injectargs(const std::string& s, std::ostringstream *oss)
{
char b[s.length()+1];
strcpy(b, s.c_str());
while (*p && *p == ' ') p++;
}
parse_argv(nargs);
- apply_changes();
+ apply_changes(oss);
}
void md_config_t::
extern struct ceph_file_layout g_default_file_layout;
+#include <iosfwd>
#include <vector>
#include <map>
#include <set>
#define OSD_REP_CHAIN 2
class config_option;
+class CephContext;
extern const char *CEPH_CONF_FILE_DEFAULT;
void parse_argv(std::vector<const char*>& args);
// Expand all metavariables. Make any pending observer callbacks.
- void apply_changes();
+ void apply_changes(std::ostringstream *oss);
// Called by the Ceph daemons to make configuration changes at runtime
- void injectargs(const std::string &s);
+ void injectargs(const std::string &s, std::ostringstream *oss);
// Set a configuration value, or crash
// Metavariables will be expanded.
}
// Expand metavariables. Invoke configuration observers.
- conf->apply_changes();
+ conf->apply_changes(NULL);
// Now we're ready to complain about config file parse errors
complain_about_parse_errors(cct, &parse_errors);
int ret = cct->_conf->parse_config_files(path_list, &parse_errors, 0);
if (ret)
return ret;
- cct->_conf->apply_changes();
+ cct->_conf->apply_changes(NULL);
complain_about_parse_errors(cct, &parse_errors);
return 0;
}
vector<const char*> args;
argv_to_vec(argc, argv, args);
cct->_conf->parse_argv(args);
- cct->_conf->apply_changes();
+ cct->_conf->apply_changes(NULL);
}
int conf_set(const char *option, const char *value)
int ret = cct->_conf->set_val(option, value);
if (ret)
return ret;
- cct->_conf->apply_changes();
+ cct->_conf->apply_changes(NULL);
return 0;
}
CephContext *cct = common_preinit(iparams, CODE_ENVIRONMENT_LIBRARY, 0);
cct->_conf->parse_env(); // environment variables coverride
- cct->_conf->apply_changes();
+ cct->_conf->apply_changes(NULL);
return ceph_create_with_context(cmount, cct);
}
CephContext *cct = common_preinit(iparams, CODE_ENVIRONMENT_LIBRARY, 0);
cct->_conf->parse_env(); // environment variables override
- cct->_conf->apply_changes();
+ cct->_conf->apply_changes(NULL);
librados::RadosClient *radosp = new librados::RadosClient(cct);
*pcluster = (void *)radosp;
return ret;
conf->parse_env(); // environment variables override
- conf->apply_changes();
+ conf->apply_changes(NULL);
complain_about_parse_errors(client->cct, &parse_errors);
return 0;
}
vector<const char*> args;
argv_to_vec(argc, argv, args);
conf->parse_argv(args);
- conf->apply_changes();
+ conf->apply_changes(NULL);
}
extern "C" int rados_conf_set(rados_t cluster, const char *option, const char *value)
int ret = conf->set_val(option, value);
if (ret)
return ret;
- conf->apply_changes();
+ conf->apply_changes(NULL);
return 0;
}
void MDS::handle_command(MMonCommand *m)
{
dout(10) << "handle_command args: " << m->cmd << dendl;
- if (m->cmd[0] == "injectargs")
- g_conf->injectargs(m->cmd[1]);
+ if (m->cmd[0] == "injectargs") {
+ std::ostringstream oss;
+ g_conf->injectargs(m->cmd[1], &oss);
+ derr << "injectargs:" << dendl;
+ derr << oss.str() << dendl;
+ }
else if (m->cmd[0] == "dumpcache") {
if (m->cmd.size() > 1)
mdcache->dump_cache(m->cmd[1].c_str());
if (m->cmd[0] == "injectargs") {
if (m->cmd.size() == 2) {
dout(0) << "parsing injected options '" << m->cmd[1] << "'" << dendl;
- g_conf->injectargs(m->cmd[1]);
+ ostringstream oss;
+ g_conf->injectargs(m->cmd[1], &oss);
+ derr << "injectargs:" << dendl;
+ derr << oss.str() << dendl;
rs = "parsed options";
r = 0;
} else {
return;
dout(20) << "handle_command args: " << m->cmd << dendl;
- if (m->cmd[0] == "injectargs")
- g_conf->injectargs(m->cmd[1]);
+ if (m->cmd[0] == "injectargs") {
+ ostringstream oss;
+ g_conf->injectargs(m->cmd[1], &oss);
+ derr << "injectargs:" << dendl;
+ derr << oss.str() << dendl;
+ }
else if (m->cmd[0] == "stop") {
dout(0) << "got shutdown" << dendl;
shutdown();
CephContext *cct = common_preinit(iparams, CODE_ENVIRONMENT_LIBRARY, 0);
cct->_conf->log_to_stderr = 1; // quiet by default
cct->_conf->parse_env(); // environment variables override
- cct->_conf->apply_changes();
+ cct->_conf->apply_changes(NULL);
common_init_finish(cct);
*rgw = cct;
TEST(PerfCounters, SimpleTest) {
g_ceph_context->_conf->set_val_or_die("admin_socket", get_rand_socket_path());
- g_ceph_context->_conf->apply_changes();
+ g_ceph_context->_conf->apply_changes(NULL);
AdminSocketClient client(get_rand_socket_path());
std::string message;
ASSERT_EQ("", client.get_message(&message));
PerfCounters* fake_pf = setup_test_perfcounters1(g_ceph_context);
coll->logger_add(fake_pf);
g_ceph_context->_conf->set_val_or_die("admin_socket", get_rand_socket_path());
- g_ceph_context->_conf->apply_changes();
+ g_ceph_context->_conf->apply_changes(NULL);
AdminSocketClient client(get_rand_socket_path());
std::string msg;
ASSERT_EQ("", client.get_message(&msg));
coll->logger_add(fake_pf1);
coll->logger_add(fake_pf2);
g_ceph_context->_conf->set_val_or_die("admin_socket", get_rand_socket_path());
- g_ceph_context->_conf->apply_changes();
+ g_ceph_context->_conf->apply_changes(NULL);
AdminSocketClient client(get_rand_socket_path());
std::string msg;