]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: avoid inserting an op into hit set multiple times 3606/head
authorZhiqiang Wang <zhiqiang.wang@intel.com>
Tue, 24 Mar 2015 03:36:49 +0000 (11:36 +0800)
committerZhiqiang Wang <zhiqiang.wang@intel.com>
Tue, 24 Mar 2015 03:36:49 +0000 (11:36 +0800)
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 <zhiqiang.wang@intel.com>
src/osd/OpRequest.cc
src/osd/OpRequest.h
src/osd/ReplicatedPG.cc

index 12963342feb78b616c6dc075863ccfcf440b2946..24e8a57337bc390ea7ec22d7f1749399679792b4 100644 (file)
@@ -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;
index 88a2704d5fa4fa14f7d057cd75f17be5f26ca6a0..7b2c61c2cff6de04db0e7c42952b62a6a57319ab 100644 (file)
@@ -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; }
index 5a065d764a80efa7a7d9b25c7910a926515c81c9..21cab2f7d2dd9966631e7a431ca07ed58cabd45f 100644 (file)
@@ -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();
+      }
     }
   }