]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/ConfigMonitor: unify module options with built-in options
authorSage Weil <sage@redhat.com>
Mon, 17 Dec 2018 20:20:43 +0000 (14:20 -0600)
committerSage Weil <sage@redhat.com>
Tue, 18 Dec 2018 23:42:59 +0000 (17:42 -0600)
Signed-off-by: Sage Weil <sage@redhat.com>
src/mon/ConfigMonitor.cc

index c7ae84427d78b037fb0320e657a7304ef04465e1..235fe679c27ba46f4363d62849a612909991e1d4 100644 (file)
@@ -5,6 +5,7 @@
 
 #include "mon/Monitor.h"
 #include "mon/ConfigMonitor.h"
+#include "mon/MgrMonitor.h"
 #include "mon/OSDMonitor.h"
 #include "messages/MConfig.h"
 #include "messages/MGetConfig.h"
@@ -152,20 +153,27 @@ bool ConfigMonitor::preprocess_command(MonOpRequestRef op)
 
   bufferlist odata;
   if (prefix == "config help") {
+    stringstream ss;
     string name;
     cmd_getval(g_ceph_context, cmdmap, "key", name);
     const Option *opt = g_conf().find_option(name);
     if (!opt) {
+      opt = mon->mgrmon()->find_module_option(name);
+    }
+    if (opt) {
+      if (f) {
+       f->dump_object("option", *opt);
+      } else {
+       opt->print(&ss);
+      }
+    } else {
       ss << "configuration option '" << name << "' not recognized";
       err = -ENOENT;
       goto reply;
     }
     if (f) {
-      f->dump_object("option", *opt);
       f->flush(odata);
     } else {
-      stringstream ss;
-      opt->print(&ss);
       odata.append(ss.str());
     }
   } else if (prefix == "config dump") {
@@ -261,6 +269,9 @@ bool ConfigMonitor::preprocess_command(MonOpRequestRef op)
        goto reply;
       }
       const Option *opt = g_conf().find_option(name);
+      if (!opt) {
+       opt = mon->mgrmon()->find_module_option(name);
+      }
       if (!opt) {
        err = -ENOENT;
        goto reply;
@@ -410,21 +421,22 @@ bool ConfigMonitor::prepare_command(MonOpRequestRef op)
     cmd_getval(g_ceph_context, cmdmap, "value", value);
 
     if (prefix == "config set") {
-      if (name.substr(0, 4) != "mgr/") {
-       const Option *opt = g_conf().find_option(name);
-       if (!opt) {
-         ss << "unrecognized config option '" << name << "'";
-         err = -EINVAL;
-         goto reply;
-       }
+      const Option *opt = g_conf().find_option(name);
+      if (!opt) {
+       opt = mon->mgrmon()->find_module_option(name);
+      }
+      if (!opt) {
+       ss << "unrecognized config option '" << name << "'";
+       err = -EINVAL;
+       goto reply;
+      }
        
-       Option::value_t real_value;
-       string errstr;
-       err = opt->parse_value(value, &real_value, &errstr, &value);
-       if (err < 0) {
-         ss << "error parsing value: " << errstr;
-         goto reply;
-       }
+      Option::value_t real_value;
+      string errstr;
+      err = opt->parse_value(value, &real_value, &errstr, &value);
+      if (err < 0) {
+       ss << "error parsing value: " << errstr;
+       goto reply;
       }
     }
 
@@ -513,6 +525,9 @@ bool ConfigMonitor::prepare_command(MonOpRequestRef op)
        }
        // a known and worthy option?
        const Option *o = g_conf().find_option(j.key);
+       if (!o) {
+         o = mon->mgrmon()->find_module_option(j.key);
+       }
        if (!o ||
            o->flags & Option::FLAG_NO_MON_UPDATE) {
          goto skip;
@@ -639,58 +654,48 @@ void ConfigMonitor::load_config()
     string who;
     if (last_slash == std::string::npos) {
       name = key;
+    } else if (auto mgrpos = key.find("/mgr/"); mgrpos != std::string::npos) {
+      name = key.substr(mgrpos + 1);
+      who = key.substr(0, mgrpos);
     } else {
       name = key.substr(last_slash + 1);
       who = key.substr(0, last_slash);
     }
 
+    const Option *opt = g_conf().find_option(name);
+    if (!opt) {
+      opt = mon->mgrmon()->find_module_option(name);
+    }
+    if (!opt) {
+      dout(10) << __func__ << " unrecognized option '" << name << "'" << dendl;
+      opt = new Option(name, Option::TYPE_STR, Option::LEVEL_UNKNOWN);
+      // FIXME: this will be leaked!
+    }
+
+    string err;
+    int r = opt->pre_validate(&value, &err);
+    if (r < 0) {
+      dout(10) << __func__ << " pre-validate failed on '" << name << "' = '"
+              << value << "' for " << name << dendl;
+    }
+    
+    MaskedOption mopt(opt);
+    mopt.raw_value = value;
     string section_name;
-    if (key.find("/mgr/") != std::string::npos) {
-      // mgr module option, "something/mgr/foo"
-      name = key.substr(key.find("/mgr/") + 1);
-      MaskedOption mopt(new Option(name, Option::TYPE_STR,
-                                  Option::LEVEL_UNKNOWN));
-      mopt.raw_value = value;      
-      Section *section = &config_map.global;;
-      section_name = "mgr";
-      if (section_name.find('.') != std::string::npos) {
-       section = &config_map.by_id[section_name];
-      } else {
-       section = &config_map.by_type[section_name];
-      }
-      section->options.insert(make_pair(name, std::move(mopt)));
-      ++num;      
+    if (who.size() &&
+       !ConfigMap::parse_mask(who, &section_name, &mopt.mask)) {
+      derr << __func__ << " ignoring key " << key << dendl;
     } else {
-      // normal option
-      const Option *opt = g_conf().find_option(name);
-      if (!opt) {
-       dout(10) << __func__ << " unrecognized option '" << name << "'" << dendl;
-       opt = new Option(name, Option::TYPE_STR, Option::LEVEL_UNKNOWN);
-      }
-      string err;
-      int r = opt->pre_validate(&value, &err);
-      if (r < 0) {
-       dout(10) << __func__ << " pre-validate failed on '" << name << "' = '"
-                << value << "' for " << name << dendl;
-      }
-    
-      MaskedOption mopt(opt);
-      mopt.raw_value = value;
-      if (who.size() &&
-         !ConfigMap::parse_mask(who, &section_name, &mopt.mask)) {
-       derr << __func__ << " ignoring key " << key << dendl;
-      } else {
-       Section *section = &config_map.global;;
-       if (section_name.size()) {
-         if (section_name.find('.') != std::string::npos) {
-           section = &config_map.by_id[section_name];
-         } else {
-           section = &config_map.by_type[section_name];
-         }
+      Section *section = &config_map.global;;
+      if (section_name.size()) {
+       if (section_name.find('.') != std::string::npos) {
+         section = &config_map.by_id[section_name];
+       } else {
+         section = &config_map.by_type[section_name];
        }
-       section->options.insert(make_pair(name, std::move(mopt)));
-       ++num;
       }
+      section->options.insert(make_pair(name, std::move(mopt)));
+      ++num;
     }
     it->next();
   }