]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
OSDMonitor: add 'osd pg-temp ...' command
authorIlya Dryomov <ilya.dryomov@inktank.com>
Fri, 28 Mar 2014 16:28:44 +0000 (18:28 +0200)
committerSage Weil <sage@inktank.com>
Mon, 31 Mar 2014 21:11:45 +0000 (14:11 -0700)
ceph osd pg-temp <pgid> [<osd1> [<osd2> ...]]

Examples:

ceph osd pg-temp 0.2 0 1 2 # set pg_temp mapping for 0.2 to osds [0,1,2]
ceph osd pg-temp 0.2 3     # set pg_temp mapping for 0.2 to osds [3]
ceph osd pg-temp 0.2       # remove pg_temp mapping for 0.2

Signed-off-by: Ilya Dryomov <ilya.dryomov@inktank.com>
Reviewed-by: Sage Weil <sage@inktank.com>
src/mon/MonCommands.h
src/mon/OSDMonitor.cc

index f71b976191e8ed922af2dfa8fd647ca7a55485c5..190be2aebad984cf329995fbbad9d1d366636ed3 100644 (file)
@@ -495,6 +495,11 @@ COMMAND("osd reweight " \
        "name=id,type=CephInt,range=0 " \
        "type=CephFloat,name=weight,range=0.0|1.0", \
        "reweight osd to 0.0 < <weight> < 1.0", "osd", "rw", "cli,rest")
+COMMAND("osd pg-temp " \
+       "name=pgid,type=CephPgid " \
+       "name=id,type=CephString,n=N,req=false", \
+       "set pg_temp mapping pgid:[<id> [<id>...]] (developers only)", \
+        "osd", "rw", "cli,rest")
 COMMAND("osd primary-affinity " \
        "name=id,type=CephOsdName " \
        "type=CephFloat,name=weight,range=0.0|1.0", \
index 28c35692bdc85f7c5e2c4aca06f2792a9d964d59..e4908fb7231ce84b04861ab2df0b2e5ff387f44e 100644 (file)
@@ -4298,6 +4298,53 @@ bool OSDMonitor::prepare_command_impl(MMonCommand *m,
                                                get_last_committed() + 1));
       return true;
     }
+  } else if (prefix == "osd pg-temp") {
+    string pgidstr;
+    if (!cmd_getval(g_ceph_context, cmdmap, "pgid", pgidstr)) {
+      ss << "unable to parse 'pgid' value '"
+         << cmd_vartype_stringify(cmdmap["pgid"]) << "'";
+      err = -EINVAL;
+      goto reply;
+    }
+    pg_t pgid;
+    if (!pgid.parse(pgidstr.c_str())) {
+      ss << "invalid pgid '" << pgidstr << "'";
+      err = -EINVAL;
+      goto reply;
+    }
+    PGMap& pg_map = mon->pgmon()->pg_map;
+    if (!pg_map.pg_stat.count(pgid)) {
+      ss << "pg " << pgid << " does not exist";
+      err = -ENOENT;
+      goto reply;
+    }
+
+    vector<string> id_vec;
+    vector<int32_t> new_pg_temp;
+    if (!cmd_getval(g_ceph_context, cmdmap, "id", id_vec)) {
+      ss << "unable to parse 'id' value(s) '"
+         << cmd_vartype_stringify(cmdmap["id"]) << "'";
+      err = -EINVAL;
+      goto reply;
+    }
+    for (unsigned i = 0; i < id_vec.size(); i++) {
+      int32_t osd = parse_osd_id(id_vec[i].c_str(), &ss);
+      if (osd < 0) {
+        err = -EINVAL;
+        goto reply;
+      }
+      if (!osdmap.exists(osd)) {
+        ss << "osd." << osd << " does not exist";
+        err = -ENOENT;
+        goto reply;
+      }
+
+      new_pg_temp.push_back(osd);
+    }
+
+    pending_inc.new_pg_temp[pgid] = new_pg_temp;
+    ss << "set " << pgid << " pg_temp mapping to " << new_pg_temp;
+    goto update;
   } else if (prefix == "osd primary-affinity") {
     int64_t id;
     if (!cmd_getval(g_ceph_context, cmdmap, "id", id)) {