diff options
author | Sage Weil <sage@inktank.com> | 2013-08-27 13:44:52 -0700 |
---|---|---|
committer | Greg Farnum <greg@inktank.com> | 2013-08-30 14:06:33 -0700 |
commit | 4e439857a694b95e2d5636aac569ae0ad80cf54d (patch) | |
tree | 471f6597fd89f865c52f39e6f9fccebc45e97c8a | |
parent | af0a0cd74a4c2a84b02dc62029d2197dd85e5b14 (diff) | |
download | ceph-4e439857a694b95e2d5636aac569ae0ad80cf54d.tar.gz |
mon/OSDMonitor: 'osd tier cache-mode <pool> <mode>'
Signed-off-by: Sage Weil <sage@inktank.com>
Signed-off-by: Greg Farnum <greg@inktank.com>
-rw-r--r-- | src/mon/MonCommands.h | 4 | ||||
-rw-r--r-- | src/mon/OSDMonitor.cc | 30 | ||||
-rw-r--r-- | src/osd/osd_types.h | 11 |
3 files changed, 45 insertions, 0 deletions
diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index 5617b17fc78..d740c1341fe 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -525,6 +525,10 @@ COMMAND("osd tier remove " \ "name=pool,type=CephPoolname " \ "name=tierpool,type=CephPoolname", "remove the tier <tierpool> from base pool <pool>", "osd", "rw", "cli,rest") +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") /* * mon/ConfigKeyService.cc */ diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 5d05967af36..39eae1d4461 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -3674,6 +3674,36 @@ done: 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 cache-mode") { + 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->is_tier()) { + ss << "pool '" << poolstr << "' is not a tier"; + err = -EINVAL; + goto reply; + } + string modestr; + cmd_getval(g_ceph_context, cmdmap, "mode", modestr); + pg_pool_t::cache_mode_t mode = pg_pool_t::get_cache_mode_from_str(modestr); + if (mode < 0) { + ss << "'" << modestr << "' is not a valid cache mode"; + err = -EINVAL; + goto reply; + } + // go + pending_inc.get_new_pool(pool_id, p)->cache_mode = mode; + ss << "set cache-mode for pool '" << poolstr + << "' to " << pg_pool_t::get_cache_mode_name(mode); + 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); diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 4bdbf1312db..f3a307e3040 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -753,6 +753,17 @@ struct pg_pool_t { default: return "unknown"; } } + static cache_mode_t get_cache_mode_from_str(const string& s) { + if (s == "none") + return CACHEMODE_NONE; + if (s == "writeback") + return CACHEMODE_WRITEBACK; + if (s == "invalidate+forward") + return CACHEMODE_INVALIDATE_FORWARD; + if (s == "readonly") + return CACHEMODE_READONLY; + return (cache_mode_t)-1; + } const char *get_cache_mode_name() const { return get_cache_mode_name(cache_mode); } |