summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-10-22 18:26:01 -0700
committerSage Weil <sage@inktank.com>2013-10-22 19:40:49 -0700
commit3dd18cca7014489fd11e68c9a6ed568ab6013c44 (patch)
tree147e72fd6d978367b3eeabae2a555aeaff4d411c
parent4bfeae43209de282fbb03b8b11e554b254dd22ba (diff)
downloadceph-3dd18cca7014489fd11e68c9a6ed568ab6013c44.tar.gz
librados: add cache_flush(), cache_evict() methods
Not yet implemented by the OSD. Signed-off-by: Sage Weil <sage@inktank.com>
-rw-r--r--src/common/ceph_strings.cc2
-rw-r--r--src/include/rados.h3
-rw-r--r--src/include/rados/librados.hpp10
-rw-r--r--src/librados/librados.cc12
-rw-r--r--src/osd/osd_types.cc2
-rw-r--r--src/osdc/Objecter.h22
6 files changed, 51 insertions, 0 deletions
diff --git a/src/common/ceph_strings.cc b/src/common/ceph_strings.cc
index a693953711f..4ad8175a2f3 100644
--- a/src/common/ceph_strings.cc
+++ b/src/common/ceph_strings.cc
@@ -53,6 +53,8 @@ const char *ceph_osd_op_name(int op)
case CEPH_OSD_OP_COPY_FROM: return "copy-from";
case CEPH_OSD_OP_UNDIRTY: return "undirty";
case CEPH_OSD_OP_ISDIRTY: return "isdirty";
+ case CEPH_OSD_OP_CACHE_FLUSH: return "cache-flush";
+ case CEPH_OSD_OP_CACHE_EVICT: return "cache-evict";
case CEPH_OSD_OP_CLONERANGE: return "clonerange";
case CEPH_OSD_OP_ASSERT_SRC_VERSION: return "assert-src-version";
diff --git a/src/include/rados.h b/src/include/rados.h
index bf4f5b5fce4..2415652ddfc 100644
--- a/src/include/rados.h
+++ b/src/include/rados.h
@@ -217,11 +217,14 @@ enum {
CEPH_OSD_OP_OMAPRMKEYS = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 24,
CEPH_OSD_OP_OMAP_CMP = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 25,
+ /* tiering */
CEPH_OSD_OP_COPY_FROM = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 26,
CEPH_OSD_OP_COPY_GET_CLASSIC = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 27,
CEPH_OSD_OP_UNDIRTY = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 28,
CEPH_OSD_OP_ISDIRTY = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 29,
CEPH_OSD_OP_COPY_GET = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 30,
+ CEPH_OSD_OP_CACHE_FLUSH = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 31,
+ CEPH_OSD_OP_CACHE_EVICT = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 32,
/** multi **/
CEPH_OSD_OP_CLONERANGE = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_MULTI | 1,
diff --git a/src/include/rados/librados.hpp b/src/include/rados/librados.hpp
index a6449c58d9b..44f1d174b3a 100644
--- a/src/include/rados/librados.hpp
+++ b/src/include/rados/librados.hpp
@@ -297,6 +297,16 @@ namespace librados
*/
void undirty();
+ /**
+ * flush a cache tier object to backing tier
+ */
+ void cache_flush();
+
+ /**
+ * evict a clean cache tier object
+ */
+ void cache_evict();
+
friend class IoCtx;
};
diff --git a/src/librados/librados.cc b/src/librados/librados.cc
index 002e58f9f4c..9a6f91e138c 100644
--- a/src/librados/librados.cc
+++ b/src/librados/librados.cc
@@ -402,6 +402,18 @@ void librados::ObjectWriteOperation::undirty()
o->undirty();
}
+void librados::ObjectWriteOperation::cache_flush()
+{
+ ::ObjectOperation *o = (::ObjectOperation *)impl;
+ o->cache_flush();
+}
+
+void librados::ObjectWriteOperation::cache_evict()
+{
+ ::ObjectOperation *o = (::ObjectOperation *)impl;
+ o->cache_evict();
+}
+
void librados::ObjectWriteOperation::tmap_put(const bufferlist &bl)
{
::ObjectOperation *o = (::ObjectOperation *)impl;
diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc
index 4b853130ad4..ef8c498bb74 100644
--- a/src/osd/osd_types.cc
+++ b/src/osd/osd_types.cc
@@ -3780,6 +3780,8 @@ ostream& operator<<(ostream& out, const OSDOp& op)
case CEPH_OSD_OP_LIST_SNAPS:
case CEPH_OSD_OP_UNDIRTY:
case CEPH_OSD_OP_ISDIRTY:
+ case CEPH_OSD_OP_CACHE_FLUSH:
+ case CEPH_OSD_OP_CACHE_EVICT:
break;
case CEPH_OSD_OP_ASSERT_VER:
out << " v" << op.op.assert_ver.ver;
diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h
index 6e85167a001..bb7be991bf4 100644
--- a/src/osdc/Objecter.h
+++ b/src/osdc/Objecter.h
@@ -867,6 +867,28 @@ struct ObjectOperation {
::encode(src, osd_op.indata);
::encode(src_oloc, osd_op.indata);
}
+
+ /**
+ * writeback content to backing tier
+ *
+ * If object is marked dirty in the cache tier, write back content
+ * to backing tier. If the object is clean this is a no-op.
+ *
+ * If writeback races with an update, return EAGAIN.
+ */
+ void cache_flush() {
+ add_op(CEPH_OSD_OP_CACHE_FLUSH);
+ }
+
+ /**
+ * evict object from cache tier
+ *
+ * If object is marked clean, remove the object from the cache tier.
+ * Otherwise, return EBUSY.
+ */
+ void cache_evict() {
+ add_op(CEPH_OSD_OP_CACHE_EVICT);
+ }
};