From: Sage Weil Date: Tue, 27 Aug 2013 20:43:09 +0000 (-0700) Subject: mon/OSDMonitor: 'osd pool tier ' X-Git-Tag: v0.69~31^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=af0a0cd74a4c2a84b02dc62029d2197dd85e5b14;p=ceph.git mon/OSDMonitor: 'osd pool tier ' Signed-off-by: Sage Weil Signed-off-by: Greg Farnum --- diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index ec1ee71c9e1c..5617b17fc789 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 ", "osd", "rw", "cli,rest") +// tiering +COMMAND("osd tier add " \ + "name=pool,type=CephPoolname " \ + "name=tierpool,type=CephPoolname", + "add the tier to base pool ", "osd", "rw", "cli,rest") +COMMAND("osd tier remove " \ + "name=pool,type=CephPoolname " \ + "name=tierpool,type=CephPoolname", + "remove the tier from base pool ", "osd", "rw", "cli,rest") /* * mon/ConfigKeyService.cc */ diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 20171178bf8a..5d05967af365 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));