From af8d6ec86bf72e351161826287939adda398bfd0 Mon Sep 17 00:00:00 2001 From: Zhiqiang Wang Date: Wed, 11 Mar 2015 12:21:15 +0800 Subject: [PATCH] osd: add support of pin/unpin objects in cache tier Signed-off-by: Zhiqiang Wang --- src/osd/ReplicatedPG.cc | 42 +++++++++++++++++++++++++++++++++++++++++ src/osd/osd_types.cc | 2 ++ src/osd/osd_types.h | 6 ++++++ 3 files changed, 50 insertions(+) diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 4ebeb6a6233da..fce23326296d6 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -3897,6 +3897,8 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& 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& 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 -- diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index 10458eca10800..7adca4fbcd2c5 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -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; diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index d51c894632bbd..961bcfa54f27c 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -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); -- 2.39.5