]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: tiering: add cache mode READPROXY
authorZhiqiang Wang <zhiqiang.wang@intel.com>
Tue, 18 Nov 2014 08:10:00 +0000 (16:10 +0800)
committerSage Weil <sage@redhat.com>
Sun, 11 Jan 2015 04:35:30 +0000 (20:35 -0800)
Signed-off-by: Zhiqiang Wang <zhiqiang.wang@intel.com>
src/mon/MonCommands.h
src/mon/OSDMonitor.cc
src/osd/ReplicatedPG.cc
src/osd/osd_types.h
src/test/pybind/test_ceph_argparse.py

index a7c6ca0360061fbe179203fc2274c6e089fd5f8e..cdac6d1096aff2eaa22ccbf2b48e676de8630914 100644 (file)
@@ -648,7 +648,7 @@ COMMAND("osd tier remove " \
        "osd", "rw", "cli,rest")
 COMMAND("osd tier cache-mode " \
        "name=pool,type=CephPoolname " \
-       "name=mode,type=CephChoices,strings=none|writeback|forward|readonly|readforward", \
+       "name=mode,type=CephChoices,strings=none|writeback|forward|readonly|readforward|readproxy", \
        "specify the caching mode for cache tier <pool>", "osd", "rw", "cli,rest")
 COMMAND("osd tier set-overlay " \
        "name=pool,type=CephPoolname " \
index 87b416eebfef554cec0ffd4233d140671c7e73e0..97ed96e9d2b970b232b22c8fbe34da0a1066b4d3 100644 (file)
@@ -5931,14 +5931,16 @@ done:
      *  forward:    Forward all reads and writes to base pool
      *  writeback:  Cache writes, promote reads from base pool
      *  readonly:   Forward writes to base pool
-     *  readforward: Writes are in writeback mode, Reads and in forward mode
+     *  readforward: Writes are in writeback mode, Reads are in forward mode
+     *  readproxy:   Writes are in writeback mode, Reads are in proxy mode
      *
      * Hence, these are the allowed transitions:
      *
      *  none -> any
-     *  forward -> readforward || writeback || any IF num_objects_dirty == 0
-     *  readforward -> forward || writeback || any IF num_objects_dirty == 0
-     *  writeback -> readforward || forward
+     *  forward -> readforward || readproxy || writeback || any IF num_objects_dirty == 0
+     *  readforward -> forward || readproxy || writeback || any IF num_objects_dirty == 0
+     *  readproxy -> forward || readforward || writeback || any IF num_objects_dirty == 0
+     *  writeback -> readforward || readproxy || forward
      *  readonly -> any
      */
 
@@ -5948,24 +5950,34 @@ done:
 
     if (p->cache_mode == pg_pool_t::CACHEMODE_WRITEBACK &&
         (mode != pg_pool_t::CACHEMODE_FORWARD &&
-         mode != pg_pool_t::CACHEMODE_READFORWARD)) {
+         mode != pg_pool_t::CACHEMODE_READFORWARD &&
+         mode != pg_pool_t::CACHEMODE_READPROXY)) {
       ss << "unable to set cache-mode '" << pg_pool_t::get_cache_mode_name(mode)
          << "' on a '" << pg_pool_t::get_cache_mode_name(p->cache_mode)
          << "' pool; only '"
          << pg_pool_t::get_cache_mode_name(pg_pool_t::CACHEMODE_FORWARD)
         << "','"
          << pg_pool_t::get_cache_mode_name(pg_pool_t::CACHEMODE_READFORWARD)
+        << "','"
+         << pg_pool_t::get_cache_mode_name(pg_pool_t::CACHEMODE_READPROXY)
         << "' allowed.";
       err = -EINVAL;
       goto reply;
     }
     if ((p->cache_mode == pg_pool_t::CACHEMODE_READFORWARD &&
         (mode != pg_pool_t::CACHEMODE_WRITEBACK &&
-         mode != pg_pool_t::CACHEMODE_FORWARD)) ||
+         mode != pg_pool_t::CACHEMODE_FORWARD &&
+         mode != pg_pool_t::CACHEMODE_READPROXY)) ||
+
+        (p->cache_mode == pg_pool_t::CACHEMODE_READPROXY &&
+        (mode != pg_pool_t::CACHEMODE_WRITEBACK &&
+         mode != pg_pool_t::CACHEMODE_FORWARD &&
+         mode != pg_pool_t::CACHEMODE_READFORWARD)) ||
 
         (p->cache_mode == pg_pool_t::CACHEMODE_FORWARD &&
         (mode != pg_pool_t::CACHEMODE_WRITEBACK &&
-         mode != pg_pool_t::CACHEMODE_READFORWARD))) {
+         mode != pg_pool_t::CACHEMODE_READFORWARD &&
+         mode != pg_pool_t::CACHEMODE_READPROXY))) {
 
       const pool_stat_t& tier_stats =
         mon->pgmon()->pg_map.get_pg_pool_sum_stat(pool_id);
index a35bcca7550b27fd1d008d958160e2cb5a3d1c45..75c8dc4effd25657b51a1259fe1aee41e42ac24e 100644 (file)
@@ -1870,6 +1870,26 @@ bool ReplicatedPG::maybe_handle_cache(OpRequestRef op,
     do_cache_redirect(op, obc);
     return true;
 
+  case pg_pool_t::CACHEMODE_READPROXY:
+    // Do writeback to the cache tier for writes
+    if (op->may_write() || write_ordered) {
+      if (agent_state &&
+         agent_state->evict_mode == TierAgentState::EVICT_MODE_FULL) {
+       dout(20) << __func__ << " cache pool full, waiting" << dendl;
+       waiting_for_cache_not_full.push_back(op);
+       return true;
+      }
+      if (can_skip_promote(op, obc)) {
+       return false;
+      }
+      promote_object(obc, missing_oid, oloc, op);
+      return true;
+    }
+
+    // If it is a read, we can read, we need to proxy it
+    do_proxy_read(op);
+    return true;
+
   default:
     assert(0 == "unrecognized cache_mode");
   }
index c893ac526d80e8610ecc7ce3aa05e3dd55bd5400..07b88aa6f98971e31f09bed7403e36c6036340f2 100644 (file)
@@ -852,7 +852,8 @@ struct pg_pool_t {
     CACHEMODE_WRITEBACK = 1,             ///< write to cache, flush later
     CACHEMODE_FORWARD = 2,               ///< forward if not in cache
     CACHEMODE_READONLY = 3,              ///< handle reads, forward writes [not strongly consistent]
-    CACHEMODE_READFORWARD = 4            ///< forward reads, write to cache flush later
+    CACHEMODE_READFORWARD = 4,           ///< forward reads, write to cache flush later
+    CACHEMODE_READPROXY = 5              ///< proxy reads, write to cache flush later
   } cache_mode_t;
   static const char *get_cache_mode_name(cache_mode_t m) {
     switch (m) {
@@ -861,6 +862,7 @@ struct pg_pool_t {
     case CACHEMODE_FORWARD: return "forward";
     case CACHEMODE_READONLY: return "readonly";
     case CACHEMODE_READFORWARD: return "readforward";
+    case CACHEMODE_READPROXY: return "readproxy";
     default: return "unknown";
     }
   }
@@ -875,6 +877,8 @@ struct pg_pool_t {
       return CACHEMODE_READONLY;
     if (s == "readforward")
       return CACHEMODE_READFORWARD;
+    if (s == "readproxy")
+      return CACHEMODE_READPROXY;
     return (cache_mode_t)-1;
   }
   const char *get_cache_mode_name() const {
@@ -888,6 +892,7 @@ struct pg_pool_t {
       return false;
     case CACHEMODE_WRITEBACK:
     case CACHEMODE_READFORWARD:
+    case CACHEMODE_READPROXY:
       return true;
     default:
       assert(0 == "implement me");
index b3c619893f0b08154c37f40a3694279cec673b8e..eb79323c0ff836752b3305b7d38568bae4c446d0 100755 (executable)
@@ -1110,7 +1110,7 @@ class TestOSD(TestArgparse):
                                                         'toomany']))
 
     def test_tier_cache_mode(self):
-        for mode in ('none', 'writeback', 'forward', 'readonly', 'readforward'):
+        for mode in ('none', 'writeback', 'forward', 'readonly', 'readforward', 'readproxy'):
             self.assert_valid_command(['osd', 'tier', 'cache-mode',
                                        'poolname', mode])
         assert_equal({}, validate_command(sigdict, ['osd', 'tier',