summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-08-27 13:43:09 -0700
committerGreg Farnum <greg@inktank.com>2013-08-29 15:00:17 -0700
commitaf0a0cd74a4c2a84b02dc62029d2197dd85e5b14 (patch)
treec0a845bba1edd6783602fd1cfc621e497927c8fc
parent5e2c86adb09d1636edca6708d343ae8999cddc3a (diff)
downloadceph-af0a0cd74a4c2a84b02dc62029d2197dd85e5b14.tar.gz
mon/OSDMonitor: 'osd pool tier <add|remove> <pool> <tierpool>'
Signed-off-by: Sage Weil <sage@inktank.com> Signed-off-by: Greg Farnum <greg@inktank.com>
-rw-r--r--src/mon/MonCommands.h9
-rw-r--r--src/mon/OSDMonitor.cc77
2 files changed, 85 insertions, 1 deletions
diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h
index ec1ee71c9e1..5617b17fc78 100644
--- a/src/mon/MonCommands.h
+++ b/src/mon/MonCommands.h
@@ -516,6 +516,15 @@ COMMAND("osd thrash " \
"name=num_epochs,type=CephInt,range=0", \
"thrash OSDs for <num_epochs>", "osd", "rw", "cli,rest")
+// tiering
+COMMAND("osd tier add " \
+ "name=pool,type=CephPoolname " \
+ "name=tierpool,type=CephPoolname",
+ "add the tier <tierpool> to base pool <pool>", "osd", "rw", "cli,rest")
+COMMAND("osd tier remove " \
+ "name=pool,type=CephPoolname " \
+ "name=tierpool,type=CephPoolname",
+ "remove the tier <tierpool> from base pool <pool>", "osd", "rw", "cli,rest")
/*
* mon/ConfigKeyService.cc
*/
diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc
index 20171178bf8..5d05967af36 100644
--- a/src/mon/OSDMonitor.cc
+++ b/src/mon/OSDMonitor.cc
@@ -3598,6 +3598,82 @@ done:
wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed()));
return true;
}
+ } else if (prefix == "osd tier add") {
+ string poolstr;
+ cmd_getval(g_ceph_context, cmdmap, "pool", poolstr);
+ int64_t pool_id = osdmap.lookup_pg_pool_name(poolstr);
+ if (pool_id < 0) {
+ ss << "unrecognized pool '" << poolstr << "'";
+ err = -ENOENT;
+ goto reply;
+ }
+ string tierpoolstr;
+ cmd_getval(g_ceph_context, cmdmap, "tierpool", tierpoolstr);
+ int64_t tierpool_id = osdmap.lookup_pg_pool_name(tierpoolstr);
+ if (tierpool_id < 0) {
+ ss << "unrecognized pool '" << tierpoolstr << "'";
+ err = -ENOENT;
+ goto reply;
+ }
+ const pg_pool_t *p = osdmap.get_pg_pool(pool_id);
+ assert(p);
+ const pg_pool_t *tp = osdmap.get_pg_pool(tierpool_id);
+ assert(tp);
+ if (p->tiers.count(tierpool_id)) {
+ assert(tp->tier_of == pool_id);
+ err = 0;
+ ss << "pool '" << tierpoolstr << "' is now (or already was) a tier of '" << poolstr << "'";
+ goto reply;
+ }
+ if (tp->is_tier()) {
+ ss << "tier pool '" << tierpoolstr << "' is already a tier of '"
+ << osdmap.get_pool_name(tp->tier_of) << "'";
+ err = -EINVAL;
+ goto reply;
+ }
+ // go
+ pending_inc.get_new_pool(pool_id, p)->tiers.insert(tierpool_id);
+ pending_inc.get_new_pool(tierpool_id, p)->tier_of = pool_id;
+ ss << "pool '" << tierpoolstr << "' is now (or already was) a tier of '" << poolstr << "'";
+ wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, ss.str(), get_last_committed()));
+ return true;
+ } else if (prefix == "osd tier remove") {
+ string poolstr;
+ cmd_getval(g_ceph_context, cmdmap, "pool", poolstr);
+ int64_t pool_id = osdmap.lookup_pg_pool_name(poolstr);
+ if (pool_id < 0) {
+ ss << "unrecognized pool '" << poolstr << "'";
+ err = -ENOENT;
+ goto reply;
+ }
+ string tierpoolstr;
+ cmd_getval(g_ceph_context, cmdmap, "tierpool", tierpoolstr);
+ int64_t tierpool_id = osdmap.lookup_pg_pool_name(tierpoolstr);
+ if (tierpool_id < 0) {
+ ss << "unrecognized pool '" << tierpoolstr << "'";
+ err = -ENOENT;
+ goto reply;
+ }
+ const pg_pool_t *p = osdmap.get_pg_pool(pool_id);
+ assert(p);
+ const pg_pool_t *tp = osdmap.get_pg_pool(tierpool_id);
+ assert(tp);
+ if (p->tiers.count(tierpool_id) == 0) {
+ ss << "pool '" << tierpoolstr << "' is now (or already was) not a tier of '" << poolstr << "'";
+ err = 0;
+ goto reply;
+ }
+ if (tp->tier_of != pool_id) {
+ ss << "tier pool '" << tierpoolstr << "' is a tier of '" << tp->tier_of << "'";
+ err = -EINVAL;
+ goto reply;
+ }
+ // go
+ pending_inc.get_new_pool(pool_id, p)->tiers.erase(tierpool_id);
+ pending_inc.get_new_pool(tierpool_id, tp)->clear_tier();
+ ss << "pool '" << tierpoolstr << "' is now (or already was) not a tier of '" << poolstr << "'";
+ wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, ss.str(), get_last_committed()));
+ return true;
} else if (prefix == "osd pool set-quota") {
string poolstr;
cmd_getval(g_ceph_context, cmdmap, "pool", poolstr);
@@ -3656,7 +3732,6 @@ done:
wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed()));
return true;
}
-
} else if (prefix == "osd thrash") {
int64_t num_epochs;
cmd_getval(g_ceph_context, cmdmap, "num_epochs", num_epochs, int64_t(0));