From: Ilya Dryomov Date: Fri, 28 Mar 2014 16:28:44 +0000 (+0200) Subject: OSDMonitor: add 'osd pg-temp ...' command X-Git-Tag: v0.79~40 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=07dcffa1df83697e538974c25b34df6229e2b178;p=ceph.git OSDMonitor: add 'osd pg-temp ...' command ceph osd pg-temp [ [ ...]] 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 Reviewed-by: Sage Weil --- diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index f71b976191e8..190be2aebad9 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -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 < < 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:[ [...]] (developers only)", \ + "osd", "rw", "cli,rest") COMMAND("osd primary-affinity " \ "name=id,type=CephOsdName " \ "type=CephFloat,name=weight,range=0.0|1.0", \ diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 28c35692bdc8..e4908fb7231c 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -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 id_vec; + vector 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)) {