]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/OSDMonitor: 'osd tier cache-mode <pool> <mode>'
authorSage Weil <sage@inktank.com>
Tue, 27 Aug 2013 20:44:52 +0000 (13:44 -0700)
committerGreg Farnum <greg@inktank.com>
Fri, 30 Aug 2013 21:06:33 +0000 (14:06 -0700)
Signed-off-by: Sage Weil <sage@inktank.com>
Signed-off-by: Greg Farnum <greg@inktank.com>
src/mon/MonCommands.h
src/mon/OSDMonitor.cc
src/osd/osd_types.h

index 5617b17fc78964ceabd4b2fe5dc408d25c1f1d70..d740c1341fe451e4ea0427511554960bdd893334 100644 (file)
@@ -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
  */
index 5d05967af36533ac035b83c75541e2d25c979eec..39eae1d4461647bbd1240434302d93a29ed63aae 100644 (file)
@@ -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);
index 4bdbf1312dbe83e332457ffebe99fe541635f524..f3a307e30402bbd570736630a1f1ddc1f6547ed5 100644 (file)
@@ -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);
   }