summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-08-27 14:11:37 -0700
committerSage Weil <sage@inktank.com>2013-08-27 15:48:50 -0700
commit61cb188d36a23f83cf161d76d3cf4a27ef8321fa (patch)
tree6e6158fb5b9928063928c348aa3c2db39856f5e9
parent68945f1e93d3359e7fcc90c5a725cca3b5398685 (diff)
downloadceph-61cb188d36a23f83cf161d76d3cf4a27ef8321fa.tar.gz
mon/OSDMonitor: 'osd tier {set,remove}-overlay <pool> [tierpool]'wip-tier
Also prevent 'osd tier remove ...' if the tierpool is the current overlay. Signed-off-by: Sage Weil <sage@inktank.com>
-rwxr-xr-xqa/workunits/cephtool/test.sh8
-rw-r--r--src/mon/MonCommands.h8
-rw-r--r--src/mon/OSDMonitor.cc67
3 files changed, 83 insertions, 0 deletions
diff --git a/qa/workunits/cephtool/test.sh b/qa/workunits/cephtool/test.sh
index 1c43bf82fd1..d92c2709dfd 100755
--- a/qa/workunits/cephtool/test.sh
+++ b/qa/workunits/cephtool/test.sh
@@ -56,9 +56,17 @@ expect_false ceph osd tier add metadata cache
ceph osd tier cache-mode cache writeback
ceph osd tier cache-mode cache readonly
ceph osd tier cache-mode cache none
+ceph osd tier set-overlay data cache
+expect_false ceph osd tier set-overlay data cache2
expect_false ceph osd tier remove data cache
+ceph osd tier remove-overlay data
+ceph osd tier set-overlay data cache2
+ceph osd tier remove-overlay data
ceph osd tier remove data cache
ceph osd tier add metadata cache
+expect_false ceph osd tier set-overlay data cache
+ceph osd tier set-overlay metadata cache
+ceph osd tier remove-overlay metadata
ceph osd tier remove metadata cache
ceph osd tier remove data cache2
ceph osd pool delete cache cache --yes-i-really-really-mean-it
diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h
index d740c1341fe..28fa80e00b7 100644
--- a/src/mon/MonCommands.h
+++ b/src/mon/MonCommands.h
@@ -529,6 +529,14 @@ COMMAND("osd tier cache-mode " \
"name=pool,type=CephPoolname " \
"name=mode,type=CephChoices,strings=none|writeback|invalidate+forward|readonly", \
"specify the caching mode for cache tier <pool>", "osd", "rw", "cli,rest")
+COMMAND("osd tier set-overlay " \
+ "name=pool,type=CephPoolname " \
+ "name=overlaypool,type=CephPoolname", \
+ "set the overlay pool for base pool <pool> to be <overlaypool>", "osd", "rw", "cli,rest")
+COMMAND("osd tier remove-overlay " \
+ "name=pool,type=CephPoolname ", \
+ "remove the overlay pool for base pool <pool>", "osd", "rw", "cli,rest")
+
/*
* mon/ConfigKeyService.cc
*/
diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc
index af9cc1902f3..99e86c65e67 100644
--- a/src/mon/OSDMonitor.cc
+++ b/src/mon/OSDMonitor.cc
@@ -3682,6 +3682,11 @@ done:
err = -EINVAL;
goto reply;
}
+ if (p->overlay == tierpoolstr) {
+ ss << "tier pool '" << tierpoolstr << "' is the overlay for '" << poolstr << "'; please remove-overlay first";
+ err = -EBUSY;
+ goto reply;
+ }
// go
ss << "removed tier '" << tierpoolstr << "' from '" << poolstr << "'";
if (pending_inc.new_pools.count(pool_id) == 0)
@@ -3692,6 +3697,68 @@ done:
pending_inc.new_pools[tierpool_id].tier_of.clear();
wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, ss.str(), get_last_committed()));
return true;
+ } else if (prefix == "osd tier set-overlay") {
+ 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 overlaypoolstr;
+ cmd_getval(g_ceph_context, cmdmap, "overlaypool", overlaypoolstr);
+ int64_t overlaypool_id = osdmap.lookup_pg_pool_name(overlaypoolstr);
+ if (overlaypool_id < 0) {
+ ss << "unrecognized pool '" << overlaypoolstr << "'";
+ err = -ENOENT;
+ goto reply;
+ }
+ const pg_pool_t *p = osdmap.get_pg_pool(pool_id);
+ assert(p);
+ if (p->tiers.count(overlaypoolstr) == 0) {
+ ss << "tier pool '" << overlaypoolstr << "' is not a tier of '" << poolstr << "'";
+ err = -EINVAL;
+ goto reply;
+ }
+ if (p->overlay == overlaypoolstr) {
+ err = 0;
+ goto reply;
+ }
+ if (p->overlay.length()) {
+ ss << "pool '" << poolstr << "' has overlay '" << p->overlay << "'; please remove-overlay first";
+ err = -EINVAL;
+ goto reply;
+ }
+ // go
+ ss << "set overlay for '" << poolstr << "' to '" << overlaypoolstr << "'";
+ if (pending_inc.new_pools.count(pool_id) == 0)
+ pending_inc.new_pools[pool_id] = *p;
+ pending_inc.new_pools[pool_id].overlay = overlaypoolstr;
+ wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, ss.str(), get_last_committed()));
+ return true;
+ } else if (prefix == "osd tier remove-overlay") {
+ 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;
+ }
+ const pg_pool_t *p = osdmap.get_pg_pool(pool_id);
+ assert(p);
+ if (p->overlay.length() == 0) {
+ err = 0;
+ goto reply;
+ }
+ // go
+ ss << "removed overlay for '" << poolstr << "'";
+ if (pending_inc.new_pools.count(pool_id) == 0)
+ pending_inc.new_pools[pool_id] = *p;
+ pending_inc.new_pools[pool_id].overlay.clear();
+ wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, ss.str(), get_last_committed()));
+ return true;
} else if (prefix == "osd tier cache-mode") {
string poolstr;
cmd_getval(g_ceph_context, cmdmap, "pool", poolstr);