diff options
author | Sage Weil <sage@inktank.com> | 2013-10-22 19:56:55 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-10-22 19:56:55 -0700 |
commit | 8db1bd5a497fe1f9acb6a307eb149a4997cf0934 (patch) | |
tree | 6e9f8a1b8210c0ca9cea0f48bd50ebd5d79d7dbd | |
parent | a15b21321e7ca1a5aa49db912a4c35c113b0095f (diff) | |
download | ceph-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.cc | 12 | ||||
-rw-r--r-- | src/osd/ReplicatedPG.h | 5 |
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 |