#define _STR(x) #x
#define STRINGIFY(x) _STR(x)
-enum {
- CONF_DEFAULT,
- CONF_MON,
- CONF_CONFFILE,
- CONF_ENV,
- CONF_OVERRIDE,
- CONF_FINAL
-};
-
const char *ceph_conf_level_name(int level)
{
switch (level) {
}
}
}
+ values_bl.clear();
return 0;
}
return _rm_val(key, CONF_OVERRIDE);
}
+void md_config_t::get_config_bl(bufferlist *bl)
+{
+ Mutex::Locker l(lock);
+ if (values_bl.length() == 0) {
+ ::encode((uint32_t)values.size(), values_bl);
+ for (auto& i : values) {
+ ::encode(i.first, values_bl);
+ ::encode((uint32_t)i.second.size(), values_bl);
+ for (auto& j : i.second) {
+ ::encode(j.first, values_bl);
+ ::encode(stringify(j.second), values_bl);
+ }
+ }
+ }
+ *bl = values_bl;
+}
+
int md_config_t::get_val(const std::string &key, char **buf, int len) const
{
Mutex::Locker l(lock);
} else {
p->second[level] = new_value;
}
+ values_bl.clear();
if (p->second.rbegin()->first > level) {
// there was a higher priority value; no effect
return 0;
}
} else {
+ values_bl.clear();
values[opt.name][level] = new_value;
}
if (matters) {
_refresh(*find_option(key));
}
+ values_bl.clear();
return 0;
}
class CephContext;
+enum {
+ CONF_DEFAULT,
+ CONF_MON,
+ CONF_CONFFILE,
+ CONF_ENV,
+ CONF_OVERRIDE,
+ CONF_FINAL
+};
+
+extern const char *ceph_conf_level_name(int level);
+
/** This class represents the current Ceph configuration.
*
* For Ceph daemons, this is the daemon configuration. Log levels, caching
/**
* The current values of all settings described by the schema
*/
- std::map<std::string, map<int,Option::value_t>> values;
+ std::map<std::string, map<int32_t,Option::value_t>> values;
+
+ /// encoded, cached copy of of values
+ bufferlist values_bl;
typedef enum {
OPT_INT, OPT_LONGLONG, OPT_STR, OPT_DOUBLE, OPT_FLOAT, OPT_BOOL,
/// clear override value
int rm_val(const std::string& key);
+ /// get encoded map<string,map<int32_t,string>> of entire config
+ void get_config_bl(bufferlist *bl);
+
// Get a configuration value.
// No metavariables will be returned (they will have already been expanded)
int get_val(const std::string &key, char **buf, int len) const;
class MMgrOpen : public Message
{
- static const int HEAD_VERSION = 2;
+ static const int HEAD_VERSION = 3;
static const int COMPAT_VERSION = 1;
public:
std::map<std::string,std::string> daemon_metadata;
std::map<std::string,std::string> daemon_status;
+ // encode map<string,map<int32_t,string>> of current config
+ bufferlist config_bl;
+
void decode_payload() override
{
bufferlist::iterator p = payload.begin();
decode(daemon_status, p);
}
}
+ if (header.version >= 3) {
+ ::decode(config_bl, p);
+ }
}
void encode_payload(uint64_t features) override {
encode(daemon_metadata, payload);
encode(daemon_status, payload);
}
+ ::encode(config_bl, payload);
}
const char *get_type_name() const override { return "mgropen"; }
class MMgrReport : public Message
{
- static const int HEAD_VERSION = 5;
+ static const int HEAD_VERSION = 6;
static const int COMPAT_VERSION = 1;
public:
std::vector<OSDHealthMetric> osd_health_metrics;
+ // encode map<string,map<int32_t,string>> of current config
+ bufferlist config_bl;
+
void decode_payload() override
{
bufferlist::iterator p = payload.begin();
if (header.version >= 5) {
decode(osd_health_metrics, p);
}
+ if (header.version >= 6) {
+ decode(config_bl, p);
+ }
}
void encode_payload(uint64_t features) override {
encode(service_name, payload);
encode(daemon_status, payload);
encode(osd_health_metrics, payload);
+ encode(config_bl, payload);
}
const char *get_type_name() const override { return "mgrreport"; }
daemon->metadata = m->daemon_metadata;
daemon->service_status = m->daemon_status;
+ auto p = m->config_bl.begin();
+ if (p != m->config_bl.end()) {
+ ::decode(daemon->config, p);
+ dout(20) << " got config " << daemon->config << dendl;
+ }
+
utime_t now = ceph_clock_now();
auto d = pending_service_map.get_daemon(m->service_name,
m->daemon_name);
auto &daemon_counters = daemon->perf_counters;
daemon_counters.update(m);
+ auto p = m->config_bl.begin();
+ if (p != m->config_bl.end()) {
+ ::decode(daemon->config, p);
+ dout(20) << " got config " << daemon->config << dendl;
+ }
+
if (daemon->service_daemon) {
utime_t now = ceph_clock_now();
if (m->daemon_status) {
std::map<std::string, std::string> service_status;
utime_t last_service_beacon;
+ // running config
+ std::map<std::string,std::map<int32_t,std::string>> config;
+
// The perf counters received in MMgrReport messages
DaemonPerfCounters perf_counters;
open->service_daemon = service_daemon;
open->daemon_metadata = daemon_metadata;
}
+ cct->_conf->get_config_bl(&open->config_bl);
session->con->send_message(open);
}
}
}
report->osd_health_metrics = std::move(osd_health_metrics);
+
+ cct->_conf->get_config_bl(&report->config_bl);
+
session->con->send_message(report);
}