diff options
author | Greg Farnum <greg@inktank.com> | 2013-08-28 17:49:48 -0700 |
---|---|---|
committer | Greg Farnum <greg@inktank.com> | 2013-08-30 14:06:33 -0700 |
commit | 3516996bb3850d7c4ddd08d09322b30fa4977ff8 (patch) | |
tree | 386a862eb720b0de4b903d779e257bab56b410a0 | |
parent | efb7ab2ae4bfdf790bf59eec21f341b0886919d2 (diff) | |
download | ceph-3516996bb3850d7c4ddd08d09322b30fa4977ff8.tar.gz |
mon/OSDMonitor: 'osd tier {set,remove}-overlay <pool> [tierpool]'
Also prevent 'osd tier remove ...' if the tierpool is the current overlay.
Signed-off-by: Sage Weil <sage@inktank.com>
-rwxr-xr-x | qa/workunits/cephtool/test.sh | 9 | ||||
-rw-r--r-- | src/mon/MonCommands.h | 8 | ||||
-rw-r--r-- | src/mon/OSDMonitor.cc | 69 |
3 files changed, 86 insertions, 0 deletions
diff --git a/qa/workunits/cephtool/test.sh b/qa/workunits/cephtool/test.sh index 6963ca3dce7..d92c2709dfd 100755 --- a/qa/workunits/cephtool/test.sh +++ b/qa/workunits/cephtool/test.sh @@ -56,8 +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 39eae1d4461..ede5f165b53 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -3668,12 +3668,81 @@ done: err = -EINVAL; goto reply; } + if (p->read_tier == tierpool_id) { + ss << "tier pool '" << tierpoolstr << "' is the overlay for '" << poolstr << "'; please remove-overlay first"; + err = -EBUSY; + 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 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(overlaypool_id) == 0) { + ss << "tier pool '" << overlaypoolstr << "' is not a tier of '" << poolstr << "'"; + err = -EINVAL; + goto reply; + } + if (p->read_tier == overlaypool_id) { + err = 0; + ss << "overlay for '" << poolstr << "' is now (or already was) '" << overlaypoolstr << "'"; + goto reply; + } + if (p->has_read_tier()) { + ss << "pool '" << poolstr << "' has overlay '" + << osdmap.get_pool_name(p->read_tier) + << "'; please remove-overlay first"; + err = -EINVAL; + goto reply; + } + // go + pending_inc.get_new_pool(pool_id, p)->read_tier = overlaypool_id; + pending_inc.get_new_pool(pool_id, p)->write_tier = overlaypool_id; + ss << "overlay for '" << poolstr << "' is now (or already was) '" << 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->has_read_tier()) { + err = 0; + ss << "there is now (or already was) no overlay for '" << poolstr << "'"; + goto reply; + } + // go + pending_inc.get_new_pool(pool_id, p)->clear_read_tier(); + pending_inc.get_new_pool(pool_id, p)->clear_write_tier(); + ss << "there is now (or already was) no overlay for '" << poolstr << "'"; + 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); |