From: Zhiqiang Wang Date: Tue, 24 Mar 2015 03:36:49 +0000 (+0800) Subject: osd: avoid inserting an op into hit set multiple times X-Git-Tag: v9.0.1~124^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0d35e012454406213137c3e859477b4597cc9e7d;p=ceph.git 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 --- diff --git a/src/osd/OpRequest.cc b/src/osd/OpRequest.cc index 12963342feb78..24e8a57337bc3 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 88a2704d5fa4f..7b2c61c2cff6d 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 5a065d764a80e..21cab2f7d2dd9 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(); + } } }