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=refs%2Fpull%2F3606%2Fhead;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 12963342feb7..24e8a57337bc 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 88a2704d5fa4..7b2c61c2cff6 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 5a065d764a80..21cab2f7d2dd 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(); + } } }