]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mgr/MgrClient: report running config to mgr
authorSage Weil <sage@redhat.com>
Mon, 4 Dec 2017 22:51:33 +0000 (16:51 -0600)
committerSage Weil <sage@redhat.com>
Tue, 6 Mar 2018 20:44:48 +0000 (14:44 -0600)
Signed-off-by: Sage Weil <sage@redhat.com>
src/common/config.cc
src/common/config.h
src/messages/MMgrOpen.h
src/messages/MMgrReport.h
src/mgr/DaemonServer.cc
src/mgr/DaemonState.h
src/mgr/MgrClient.cc

index 5e18029a650004b355459cfbbb273a1d596a2ece..bfff12dc97dd8b05b999b85ca3290a138ef666ae 100644 (file)
@@ -51,15 +51,6 @@ static const char *CEPH_CONF_FILE_DEFAULT = "$data_dir/config, /etc/ceph/$cluste
 #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) {
@@ -310,6 +301,7 @@ int md_config_t::set_mon_vals(CephContext *cct, const map<string,string>& kv)
       }
     }
   }
+  values_bl.clear();
   return 0;
 }
 
@@ -893,6 +885,23 @@ int md_config_t::rm_val(const std::string& key)
   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);
@@ -1237,11 +1246,13 @@ int md_config_t::_set_val(
     } 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;
   }
 
@@ -1291,6 +1302,7 @@ int md_config_t::_rm_val(const std::string& key, int level)
   if (matters) {
     _refresh(*find_option(key));
   }
+  values_bl.clear();
   return 0;
 }
 
index 15a83fba3a36e327d0d65f4c7d65708609577be1..af4e50fd4af5f3422bc26d2b00acec10b13b2e92 100644 (file)
 
 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
@@ -90,7 +101,10 @@ public:
   /**
    * 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,
@@ -165,6 +179,9 @@ public:
   /// 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;
index 42fedee8010de17e71c3e487ab64b57dec58cdb3..171ef5a1e25868286aa9492f55bb84bb8301b75f 100644 (file)
@@ -19,7 +19,7 @@
 
 class MMgrOpen : public Message
 {
-  static const int HEAD_VERSION = 2;
+  static const int HEAD_VERSION = 3;
   static const int COMPAT_VERSION = 1;
 
 public:
@@ -31,6 +31,9 @@ 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();
@@ -43,6 +46,9 @@ public:
        decode(daemon_status, p);
       }
     }
+    if (header.version >= 3) {
+      ::decode(config_bl, p);
+    }
   }
 
   void encode_payload(uint64_t features) override {
@@ -54,6 +60,7 @@ public:
       encode(daemon_metadata, payload);
       encode(daemon_status, payload);
     }
+    ::encode(config_bl, payload);
   }
 
   const char *get_type_name() const override { return "mgropen"; }
index 66beab56b49c28fe610c341a949e10818ef3d014..ecc9c4ad7f76cafcfd1240e905a0d6f762eff419 100644 (file)
@@ -72,7 +72,7 @@ WRITE_CLASS_ENCODER(PerfCounterType)
 
 class MMgrReport : public Message
 {
-  static const int HEAD_VERSION = 5;
+  static const int HEAD_VERSION = 6;
   static const int COMPAT_VERSION = 1;
 
 public:
@@ -100,6 +100,9 @@ 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();
@@ -115,6 +118,9 @@ public:
     if (header.version >= 5) {
       decode(osd_health_metrics, p);
     }
+    if (header.version >= 6) {
+      decode(config_bl, p);
+    }
   }
 
   void encode_payload(uint64_t features) override {
@@ -126,6 +132,7 @@ public:
     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"; }
index 090c2af977832ca8e83504d37413a6b6a5174fe5..165e4e86ad5660327d3492c4c07dfdd7fb686055 100644 (file)
@@ -378,6 +378,12 @@ bool DaemonServer::handle_open(MMgrOpen *m)
     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);
@@ -493,6 +499,12 @@ bool DaemonServer::handle_report(MMgrReport *m)
     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) {
index 9a12b1187c6aa8977259bfca7574b1c9eaf7cbae..352541583b3a141d8ca162f32c373cfc6c35dce0 100644 (file)
@@ -106,6 +106,9 @@ class DaemonState
   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;
 
index 15be2e7ddd5e0c16fd16ea406770069a3a8221a2..2b557d0acef1fe390cbc3066e1f9ece0b6b93882 100644 (file)
@@ -174,6 +174,7 @@ void MgrClient::_send_open()
       open->service_daemon = service_daemon;
       open->daemon_metadata = daemon_metadata;
     }
+    cct->_conf->get_config_bl(&open->config_bl);
     session->con->send_message(open);
   }
 }
@@ -328,6 +329,9 @@ void MgrClient::send_report()
   }
 
   report->osd_health_metrics = std::move(osd_health_metrics);
+
+  cct->_conf->get_config_bl(&report->config_bl);
+
   session->con->send_message(report);
 }