summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-08-27 13:44:52 -0700
committerGreg Farnum <greg@inktank.com>2013-08-30 14:06:33 -0700
commit4e439857a694b95e2d5636aac569ae0ad80cf54d (patch)
tree471f6597fd89f865c52f39e6f9fccebc45e97c8a
parentaf0a0cd74a4c2a84b02dc62029d2197dd85e5b14 (diff)
downloadceph-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.h4
-rw-r--r--src/mon/OSDMonitor.cc30
-rw-r--r--src/osd/osd_types.h11
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);
}