From fa5b6e6d5e59c1dc501c834f2e8625efe601df38 Mon Sep 17 00:00:00 2001 From: Zhiqiang Wang Date: Wed, 27 May 2015 21:54:35 +0800 Subject: [PATCH] osd: skip promotion when proxying a delete op When the object is deleted, there is no need to promote it. Signed-off-by: Zhiqiang Wang --- src/osd/OSD.cc | 4 ++++ src/osd/OpRequest.cc | 4 ++++ src/osd/OpRequest.h | 2 ++ src/osd/ReplicatedPG.cc | 8 +++++--- src/osd/osd_types.h | 1 + 5 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index f10ead5c23f..00df5129179 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -8642,6 +8642,10 @@ int OSD::init_op_flags(OpRequestRef& op) iter->op.flags == CEPH_OSD_OP_FLAG_FAILOK) { op->set_skip_handle_cache(); } + // skip promotion when proxying a delete op + if (m->ops.size() == 1) { + op->set_skip_promote(); + } break; case CEPH_OSD_OP_CACHE_TRY_FLUSH: diff --git a/src/osd/OpRequest.cc b/src/osd/OpRequest.cc index fb6007c0fa7..7104a315663 100644 --- a/src/osd/OpRequest.cc +++ b/src/osd/OpRequest.cc @@ -104,6 +104,9 @@ bool OpRequest::need_promote() { bool OpRequest::need_skip_handle_cache() { return check_rmw(CEPH_OSD_RMW_FLAG_SKIP_HANDLE_CACHE); } +bool OpRequest::need_skip_promote() { + return check_rmw(CEPH_OSD_RMW_FLAG_SKIP_PROMOTE); +} void OpRequest::set_rmw_flags(int flags) { #ifdef WITH_LTTNG @@ -123,6 +126,7 @@ void OpRequest::set_pg_op() { set_rmw_flags(CEPH_OSD_RMW_FLAG_PGOP); } void OpRequest::set_cache() { set_rmw_flags(CEPH_OSD_RMW_FLAG_CACHE); } void OpRequest::set_promote() { set_rmw_flags(CEPH_OSD_RMW_FLAG_FORCE_PROMOTE); } void OpRequest::set_skip_handle_cache() { set_rmw_flags(CEPH_OSD_RMW_FLAG_SKIP_HANDLE_CACHE); } +void OpRequest::set_skip_promote() { set_rmw_flags(CEPH_OSD_RMW_FLAG_SKIP_PROMOTE); } void OpRequest::mark_flag_point(uint8_t flag, const string& s) { #ifdef WITH_LTTNG diff --git a/src/osd/OpRequest.h b/src/osd/OpRequest.h index 0a79a7de536..c8649b8500a 100644 --- a/src/osd/OpRequest.h +++ b/src/osd/OpRequest.h @@ -67,6 +67,7 @@ struct OpRequest : public TrackedOp { bool need_class_write_cap(); bool need_promote(); bool need_skip_handle_cache(); + bool need_skip_promote(); void set_read(); void set_write(); void set_cache(); @@ -75,6 +76,7 @@ struct OpRequest : public TrackedOp { void set_pg_op(); void set_promote(); void set_skip_handle_cache(); + void set_skip_promote(); void _dump(utime_t now, Formatter *f) const; diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 79aedf20bf6..aa87d85a988 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -1863,9 +1863,11 @@ bool ReplicatedPG::maybe_handle_cache(OpRequestRef op, } // Promote too? - maybe_promote(obc, missing_oid, oloc, in_hit_set, - pool.info.min_write_recency_for_promote, - OpRequestRef()); + if (!op->need_skip_promote()) { + maybe_promote(obc, missing_oid, oloc, in_hit_set, + pool.info.min_write_recency_for_promote, + OpRequestRef()); + } } else { if (can_proxy_read) do_proxy_read(op); diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 94de7abdb2e..73df5bb7ccf 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -261,6 +261,7 @@ enum { CEPH_OSD_RMW_FLAG_CACHE = (1 << 6), CEPH_OSD_RMW_FLAG_FORCE_PROMOTE = (1 << 7), CEPH_OSD_RMW_FLAG_SKIP_HANDLE_CACHE = (1 << 8), + CEPH_OSD_RMW_FLAG_SKIP_PROMOTE = (1 << 9), }; -- 2.47.3