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)
}
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 --
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;
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;
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;
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);