From 3516996bb3850d7c4ddd08d09322b30fa4977ff8 Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Wed, 28 Aug 2013 17:49:48 -0700 Subject: [PATCH] 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 | 9 +++++ src/mon/MonCommands.h | 8 ++++ src/mon/OSDMonitor.cc | 69 +++++++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+) diff --git a/qa/workunits/cephtool/test.sh b/qa/workunits/cephtool/test.sh index 6963ca3dce723..d92c2709dfded 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 d740c1341fe45..28fa80e00b798 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 39eae1d446164..ede5f165b539e 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); -- 2.39.5