From 0d35e012454406213137c3e859477b4597cc9e7d Mon Sep 17 00:00:00 2001 From: Zhiqiang Wang Date: Tue, 24 Mar 2015 11:36:49 +0800 Subject: [PATCH] osd: avoid inserting an op into hit set multiple times When an op is enqueued multiple times, it is inserted into the hit set every time. Only need to insert once. Signed-off-by: Zhiqiang Wang --- src/osd/OpRequest.cc | 3 ++- src/osd/OpRequest.h | 1 + src/osd/ReplicatedPG.cc | 11 +++++++---- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/osd/OpRequest.cc b/src/osd/OpRequest.cc index 12963342feb..24e8a57337b 100644 --- a/src/osd/OpRequest.cc +++ b/src/osd/OpRequest.cc @@ -23,7 +23,8 @@ OpRequest::OpRequest(Message *req, OpTracker *tracker) : TrackedOp(tracker, req->get_recv_stamp()), rmw_flags(0), request(req), hit_flag_points(0), latest_flag_point(0), - send_map_update(false), sent_epoch(0) { + send_map_update(false), sent_epoch(0), + hitset_inserted(false) { if (req->get_priority() < tracker->cct->_conf->osd_client_op_priority) { // don't warn as quickly for low priority ops warn_interval_multiplier = tracker->cct->_conf->osd_recovery_op_warn_multiple; diff --git a/src/osd/OpRequest.h b/src/osd/OpRequest.h index 88a2704d5fa..7b2c61c2cff 100644 --- a/src/osd/OpRequest.h +++ b/src/osd/OpRequest.h @@ -105,6 +105,7 @@ public: } bool send_map_update; epoch_t sent_epoch; + bool hitset_inserted; Message *get_req() const { return request; } bool been_queued_for_pg() { return hit_flag_points & flag_queued_for_pg; } bool been_reached_pg() { return hit_flag_points & flag_reached_pg; } diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 5a065d764a8..21cab2f7d2d 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -1614,10 +1614,13 @@ void ReplicatedPG::do_op(OpRequestRef& op) if (missing_oid != hobject_t() && hit_set->contains(missing_oid)) in_hit_set = true; } - hit_set->insert(oid); - if (hit_set->is_full() || - hit_set_start_stamp + pool.info.hit_set_period <= m->get_recv_stamp()) { - hit_set_persist(); + if (!op->hitset_inserted) { + hit_set->insert(oid); + op->hitset_inserted = true; + if (hit_set->is_full() || + hit_set_start_stamp + pool.info.hit_set_period <= m->get_recv_stamp()) { + hit_set_persist(); + } } } -- 2.47.3