]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/DaemonServer: move reweight-by-* to mgr
authorKefu Chai <kchai@redhat.com>
Sat, 8 Apr 2017 13:33:52 +0000 (21:33 +0800)
committerKefu Chai <kchai@redhat.com>
Mon, 10 Apr 2017 15:20:16 +0000 (23:20 +0800)
Signed-off-by: Kefu Chai <kchai@redhat.com>
src/mgr/DaemonServer.cc
src/mgr/DaemonServer.h
src/mgr/MgrCommands.h
src/mon/MonCommands.h
src/vstart.sh

index 8ec2dd4484f04d2e3e56cf72491dbd85273972c1..7e73e4357bbc0aad79fe0af19c6adacb1f1ba3e7 100644 (file)
@@ -15,6 +15,8 @@
 
 #include "auth/RotatingKeyRing.h"
 
+#include "json_spirit/json_spirit_writer.h"
+
 #include "messages/MMgrOpen.h"
 #include "messages/MMgrConfigure.h"
 #include "messages/MCommand.h"
@@ -369,6 +371,24 @@ bool DaemonServer::_allowed_command(
   return capable;
 }
 
+class ReplyOnFinish : public Context {
+  DaemonServer* mgr;
+  MCommand *m;
+  bufferlist odata;
+
+public:
+  bufferlist from_mon;
+  string outs;
+
+  ReplyOnFinish(DaemonServer* mgr, MCommand *m, bufferlist&& odata)
+    : mgr(mgr), m(m), odata(std::move(odata))
+  {}
+  void finish(int r) override {
+    odata.claim_append(from_mon);
+    mgr->_reply(m, r, outs, odata);
+  }
+};
+
 bool DaemonServer::handle_command(MCommand *m)
 {
   int r = 0;
@@ -510,6 +530,95 @@ bool DaemonServer::handle_command(MCommand *m)
     ss << "instructing pg " << pgid << " on osd." << acting_primary
        << " (" << inst << ") to " << scrubop;
     return _reply(m, 0, ss.str(), odata);
+  } else if (prefix == "osd reweight-by-pg" ||
+            prefix == "osd reweight-by-utilization" ||
+            prefix == "osd test-reweight-by-pg" ||
+            prefix == "osd test-reweight-by-utilization") {
+    bool by_pg =
+      prefix == "osd reweight-by-pg" || prefix == "osd test-reweight-by-pg";
+    bool dry_run =
+      prefix == "osd test-reweight-by-pg" ||
+      prefix == "osd test-reweight-by-utilization";
+    int64_t oload;
+    cmd_getval(g_ceph_context, cmdmap, "oload", oload, int64_t(120));
+    set<int64_t> pools;
+    vector<string> poolnames;
+    cmd_getval(g_ceph_context, cmdmap, "pools", poolnames);
+    cluster_state.with_osdmap([&](const OSDMap& osdmap) {
+       for (const auto& poolname : poolnames) {
+         int64_t pool = osdmap.lookup_pg_pool_name(poolname);
+         if (pool < 0) {
+           ss << "pool '" << poolname << "' does not exist";
+           r = -ENOENT;
+         }
+         pools.insert(pool);
+       }
+      });
+    if (r) {
+      return _reply(m, r, ss.str(), odata);
+    }
+    double max_change = g_conf->mon_reweight_max_change;
+    cmd_getval(g_ceph_context, cmdmap, "max_change", max_change);
+    if (max_change <= 0.0) {
+      ss << "max_change " << max_change << " must be positive";
+      return _reply(m, -EINVAL, ss.str(), odata);
+    }
+    int64_t max_osds = g_conf->mon_reweight_max_osds;
+    cmd_getval(g_ceph_context, cmdmap, "max_osds", max_osds);
+    if (max_osds <= 0) {
+      ss << "max_osds " << max_osds << " must be positive";
+      return _reply(m, -EINVAL, ss.str(), odata);
+    }
+    string no_increasing;
+    cmd_getval(g_ceph_context, cmdmap, "no_increasing", no_increasing);
+    string out_str;
+    map<int32_t, uint32_t> new_weights;
+    cluster_state.with_pgmap(
+      [&](const PGMap& pgmap) {
+       cluster_state.with_osdmap([&](const OSDMap& osdmap) {
+           r = reweight::by_utilization(osdmap, pgmap,
+                                        oload,
+                                        max_change,
+                                        max_osds,
+                                        by_pg,
+                                        pools.empty() ? NULL : &pools,
+                                        no_increasing == "--no-increasing",
+                                        &new_weights,
+                                        &ss, &out_str, f.get());
+         });
+      });
+    if (r >= 0) {
+      dout(10) << "reweight::by_utilization: finished with " << out_str << dendl;
+    }
+    if (f)
+      f->flush(odata);
+    else
+      odata.append(out_str);
+    if (r < 0) {
+      ss << "FAILED reweight-by-pg";
+      return _reply(m, r, ss.str(), odata);
+    } else if (r == 0 || dry_run) {
+      ss << "no change";
+      return _reply(m, r, ss.str(), odata);
+    } else {
+      json_spirit::Object json_object;
+      for (const auto& osd_weight : new_weights) {
+       json_spirit::Config::add(json_object,
+                                std::to_string(osd_weight.first),
+                                std::to_string(osd_weight.second));
+      }
+      string s = json_spirit::write(json_object);
+      std::replace(begin(s), end(s), '\"', '\'');
+      const string cmd =
+       "{"
+       "\"prefix\": \"osd reweightn\", "
+       "\"weights\": \"" + s + "\""
+       "}";
+      auto on_finish = new ReplyOnFinish(this, m, std::move(odata));
+      monc->start_mon_command({cmd}, {},
+                             &on_finish->from_mon, &on_finish->outs, on_finish);
+      return true;
+    }
   } else {
     cluster_state.with_pgmap(
       [&](const PGMap& pg_map) {
index 4b4bafd0a9d42c667d3b03dfdd8df3ee603b7d04..af6d383ba506018f6b47c5fc2d0ec82d28cf121a 100644 (file)
@@ -74,6 +74,7 @@ protected:
     const MgrCommand *this_cmd);
 
 private:
+  friend class ReplyOnFinish;
   bool _reply(MCommand* m,
              int ret, const std::string& s, const bufferlist& payload);
 
index 6278f516360845660498463fe00f5e34d073c206..d7335b27eadc5947daa0c2a061b535bdae869909 100644 (file)
@@ -68,3 +68,31 @@ COMMAND("osd pool stats " \
         "name=name,type=CephString,req=false",
         "obtain stats from all pools, or from specified pool",
         "osd", "r", "cli,rest")
+COMMAND("osd reweight-by-utilization " \
+       "name=oload,type=CephInt,req=false " \
+       "name=max_change,type=CephFloat,req=false "                     \
+       "name=max_osds,type=CephInt,req=false "                 \
+       "name=no_increasing,type=CephChoices,strings=--no-increasing,req=false",\
+       "reweight OSDs by utilization [overload-percentage-for-consideration, default 120]", \
+       "osd", "rw", "cli,rest")
+COMMAND("osd test-reweight-by-utilization " \
+       "name=oload,type=CephInt,req=false " \
+       "name=max_change,type=CephFloat,req=false "                     \
+       "name=max_osds,type=CephInt,req=false "                 \
+       "name=no_increasing,type=CephChoices,strings=--no-increasing,req=false",\
+       "dry run of reweight OSDs by utilization [overload-percentage-for-consideration, default 120]", \
+       "osd", "rw", "cli,rest")
+COMMAND("osd reweight-by-pg " \
+       "name=oload,type=CephInt,req=false " \
+       "name=max_change,type=CephFloat,req=false "                     \
+       "name=max_osds,type=CephInt,req=false "                 \
+       "name=pools,type=CephPoolname,n=N,req=false",                   \
+       "reweight OSDs by PG distribution [overload-percentage-for-consideration, default 120]", \
+       "osd", "rw", "cli,rest")
+COMMAND("osd test-reweight-by-pg " \
+       "name=oload,type=CephInt,req=false " \
+       "name=max_change,type=CephFloat,req=false "                     \
+       "name=max_osds,type=CephInt,req=false "                 \
+       "name=pools,type=CephPoolname,n=N,req=false",                   \
+       "dry run of reweight OSDs by PG distribution [overload-percentage-for-consideration, default 120]", \
+       "osd", "rw", "cli,rest")
index 00eac7a93eb0e3e9ca16ed755b895d809e1d9efe..99f0e73de1e4af58edbf4593ff4ff96d181ce09c 100644 (file)
@@ -736,34 +736,6 @@ COMMAND("osd pool get-quota " \
 COMMAND("osd utilization",
        "get basic pg distribution stats",
        "osd", "r", "cli,rest")
-COMMAND("osd reweight-by-utilization " \
-       "name=oload,type=CephInt,req=false " \
-       "name=max_change,type=CephFloat,req=false "                     \
-       "name=max_osds,type=CephInt,req=false "                 \
-       "name=no_increasing,type=CephChoices,strings=--no-increasing,req=false",\
-       "reweight OSDs by utilization [overload-percentage-for-consideration, default 120]", \
-       "osd", "rw", "cli,rest")
-COMMAND("osd test-reweight-by-utilization " \
-       "name=oload,type=CephInt,req=false " \
-       "name=max_change,type=CephFloat,req=false "                     \
-       "name=max_osds,type=CephInt,req=false "                 \
-       "name=no_increasing,type=CephChoices,strings=--no-increasing,req=false",\
-       "dry run of reweight OSDs by utilization [overload-percentage-for-consideration, default 120]", \
-       "osd", "rw", "cli,rest")
-COMMAND("osd reweight-by-pg " \
-       "name=oload,type=CephInt,req=false " \
-       "name=max_change,type=CephFloat,req=false "                     \
-       "name=max_osds,type=CephInt,req=false "                 \
-       "name=pools,type=CephPoolname,n=N,req=false",                   \
-       "reweight OSDs by PG distribution [overload-percentage-for-consideration, default 120]", \
-       "osd", "rw", "cli,rest")
-COMMAND("osd test-reweight-by-pg " \
-       "name=oload,type=CephInt,req=false " \
-       "name=max_change,type=CephFloat,req=false "                     \
-       "name=max_osds,type=CephInt,req=false "                 \
-       "name=pools,type=CephPoolname,n=N,req=false",                   \
-       "dry run of reweight OSDs by PG distribution [overload-percentage-for-consideration, default 120]", \
-       "osd", "rw", "cli,rest")
 COMMAND("osd df " \
        "name=output_method,type=CephChoices,strings=plain|tree,req=false", \
        "show OSD utilization", "osd", "r", "cli,rest")
index 5012658022554e81004a35afeb5da25df2b259c7..1b4b0518f9aa7b5fdefefc7d83ac7083539bbba1 100755 (executable)
@@ -436,6 +436,7 @@ $extra_conf
         mgr modules = rest fsstatus
         mgr data = $CEPH_DEV_DIR/mgr.\$id
         mgr module path = $MGR_PYTHON_PATH
+        mon reweight min pgs per osd = 4
 $DAEMONOPTS
 $CMGRDEBUG
 $extra_conf