summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-10-22 19:56:55 -0700
committerSage Weil <sage@inktank.com>2013-10-22 19:56:55 -0700
commit8db1bd5a497fe1f9acb6a307eb149a4997cf0934 (patch)
tree6e9f8a1b8210c0ca9cea0f48bd50ebd5d79d7dbd
parenta15b21321e7ca1a5aa49db912a4c35c113b0095f (diff)
downloadceph-8db1bd5a497fe1f9acb6a307eb149a4997cf0934.tar.gz
osd/ReplicatedPG: skip promote for DELETE
If an op starts with DELETE there is no need to promote the old content from the base tier. Signed-off-by: Sage Weil <sage@inktank.com>
-rw-r--r--src/osd/ReplicatedPG.cc12
-rw-r--r--src/osd/ReplicatedPG.h5
2 files changed, 17 insertions, 0 deletions
diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc
index ac4d623f1e5..d88bfeb1fa4 100644
--- a/src/osd/ReplicatedPG.cc
+++ b/src/osd/ReplicatedPG.cc
@@ -1219,6 +1219,8 @@ bool ReplicatedPG::maybe_handle_cache(OpRequestRef op, ObjectContextRef obc,
case pg_pool_t::CACHEMODE_WRITEBACK:
if (obc.get() && obc->obs.exists) { // we have the object already
return false;
+ } else if (can_skip_promote(op, obc)) {
+ return false;
} else { // try and promote!
promote_object(op, obc);
return true;
@@ -1247,6 +1249,16 @@ bool ReplicatedPG::maybe_handle_cache(OpRequestRef op, ObjectContextRef obc,
return false;
}
+bool ReplicatedPG::can_skip_promote(OpRequestRef op, ObjectContextRef obc)
+{
+ MOSDOp *m = static_cast<MOSDOp*>(op->get_req());
+ if (m->ops.empty())
+ return false;
+ if (m->ops[0].op.op == CEPH_OSD_OP_DELETE)
+ return true;
+ return false;
+}
+
void ReplicatedPG::do_cache_redirect(OpRequestRef op, ObjectContextRef obc)
{
MOSDOp *m = static_cast<MOSDOp*>(op->get_req());
diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h
index 6b61d8adeaa..67fbd89610e 100644
--- a/src/osd/ReplicatedPG.h
+++ b/src/osd/ReplicatedPG.h
@@ -906,6 +906,11 @@ protected:
*/
void promote_object(OpRequestRef op, ObjectContextRef obc);
+ /**
+ * Check if the op is such that we can skip promote (e.g., DELETE)
+ */
+ bool can_skip_promote(OpRequestRef op, ObjectContextRef obc);
+
int prepare_transaction(OpContext *ctx);
// pg on-disk content