]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: add support of pin/unpin objects in cache tier
authorZhiqiang Wang <zhiqiang.wang@intel.com>
Wed, 11 Mar 2015 04:21:15 +0000 (12:21 +0800)
committerSage Weil <sage@redhat.com>
Tue, 20 Oct 2015 14:34:49 +0000 (10:34 -0400)
Signed-off-by: Zhiqiang Wang <zhiqiang.wang@intel.com>
src/osd/ReplicatedPG.cc
src/osd/osd_types.cc
src/osd/osd_types.h

index 4ebeb6a6233daa85cdfecaf79eaa1225385f97aa..fce23326296d636ae8abe409658fc8ad29764f9b 100644 (file)
@@ -3897,6 +3897,8 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
     case CEPH_OSD_OP_CACHE_TRY_FLUSH:
     case CEPH_OSD_OP_UNDIRTY:
     case CEPH_OSD_OP_COPY_FROM:  // we handle user_version update explicitly
+    case CEPH_OSD_OP_CACHE_PIN:
+    case CEPH_OSD_OP_CACHE_UNPIN:
       break;
     default:
       if (op.op & CEPH_OSD_OP_MODE_WR)
@@ -5069,6 +5071,46 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
       }
       break;
 
+    case CEPH_OSD_OP_CACHE_PIN:
+      ++ctx->num_write;
+      {
+       tracepoint(osd, do_osd_op_pre_cache_pin, soid.oid.name.c_str(), soid.snap.val);
+        if (!obs.exists) {
+         assert(!oi.is_cache_pinned());
+          ctx->mod_desc.create();
+          t->touch(soid);
+          ctx->delta_stats.num_objects++;
+          obs.exists = true;
+         obs.oi.new_object();
+        }
+
+       if (!oi.is_cache_pinned()) {
+         oi.set_flag(object_info_t::FLAG_CACHE_PIN);
+         ctx->modify = true;
+         ctx->delta_stats.num_wr++;
+       }
+       result = 0;
+      }
+      break;
+
+    case CEPH_OSD_OP_CACHE_UNPIN:
+      ++ctx->num_write;
+      {
+       tracepoint(osd, do_osd_op_pre_cache_unpin, soid.oid.name.c_str(), soid.snap.val);
+        if (!obs.exists) {
+         result = 0;
+         break;
+        }
+
+       if (oi.is_cache_pinned()) {
+         oi.clear_flag(object_info_t::FLAG_CACHE_PIN);
+         ctx->modify = true;
+         ctx->delta_stats.num_wr++;
+       }
+       result = 0;
+      }
+      break;
+
 
       // -- object attrs --
       
index 10458eca1080072373967ff146ac8164320a321c..7adca4fbcd2c5e0d5413a20925b3578fbdc41d4b 100644 (file)
@@ -5133,6 +5133,8 @@ ostream& operator<<(ostream& out, const OSDOp& op)
     case CEPH_OSD_OP_CACHE_FLUSH:
     case CEPH_OSD_OP_CACHE_TRY_FLUSH:
     case CEPH_OSD_OP_CACHE_EVICT:
+    case CEPH_OSD_OP_CACHE_PIN:
+    case CEPH_OSD_OP_CACHE_UNPIN:
       break;
     case CEPH_OSD_OP_ASSERT_VER:
       out << " v" << op.op.assert_ver.ver;
index d51c894632bbd99064eee2cb6541eec468d311b8..961bcfa54f27c24dcc0560366b527709f3f64893 100644 (file)
@@ -3012,6 +3012,7 @@ struct object_info_t {
     FLAG_OMAP     = 1 << 3,  // has (or may have) some/any omap data
     FLAG_DATA_DIGEST = 1 << 4,  // has data crc
     FLAG_OMAP_DIGEST = 1 << 5,  // has omap crc
+    FLAG_CACHE_PIN = 1 << 6,    // pin the object in cache tier
     // ...
     FLAG_USES_TMAP = 1<<8,  // deprecated; no longer used.
   } flag_t;
@@ -3034,6 +3035,8 @@ struct object_info_t {
       s += "|data_digest";
     if (flags & FLAG_OMAP_DIGEST)
       s += "|omap_digest";
+    if (flags & FLAG_CACHE_PIN)
+      s += "|cache_pin";
     if (s.length())
       return s.substr(1);
     return s;
@@ -3084,6 +3087,9 @@ struct object_info_t {
   bool is_omap_digest() const {
     return test_flag(FLAG_OMAP_DIGEST);
   }
+  bool is_cache_pinned() const {
+    return test_flag(FLAG_CACHE_PIN);
+  }
 
   void set_data_digest(__u32 d) {
     set_flag(FLAG_DATA_DIGEST);