From 61cb188d36a23f83cf161d76d3cf4a27ef8321fa Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 27 Aug 2013 14:11:37 -0700 Subject: mon/OSDMonitor: 'osd tier {set,remove}-overlay [tierpool]' Also prevent 'osd tier remove ...' if the tierpool is the current overlay. Signed-off-by: Sage Weil --- qa/workunits/cephtool/test.sh | 8 ++++++ src/mon/MonCommands.h | 8 ++++++ src/mon/OSDMonitor.cc | 67 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+) 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 ", "osd", "rw", "cli,rest") +COMMAND("osd tier set-overlay " \ + "name=pool,type=CephPoolname " \ + "name=overlaypool,type=CephPoolname", \ + "set the overlay pool for base pool to be ", "osd", "rw", "cli,rest") +COMMAND("osd tier remove-overlay " \ + "name=pool,type=CephPoolname ", \ + "remove the overlay pool for base 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); -- cgit v1.2.1