]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
msg/async: Skip the duplicated processing of the same link. 20952/head
authorshangfufei <shangfufei@inspur.com>
Tue, 13 Nov 2018 03:10:28 +0000 (11:10 +0800)
committershangfufei <shangfufei@inspur.com>
Thu, 29 Nov 2018 06:53:16 +0000 (14:53 +0800)
Update Event.cc

Signed-off-by: shangfufei <shangfufei@inspur.com>
src/msg/async/Event.cc

index b2a25660b34684fa9058f8bbd228805fe7bb6e1e..42987eed4d9c62f2264b78aa5b7b924d5548d3f0 100644 (file)
@@ -452,12 +452,16 @@ int EventCenter::process_events(unsigned timeout_microseconds,  ceph::timespan *
 
 void EventCenter::dispatch_event_external(EventCallbackRef e)
 {
-  external_lock.lock();
-  external_events.push_back(e);
-  bool wake = !external_num_events.load();
-  uint64_t num = ++external_num_events;
-  external_lock.unlock();
-  if (!in_thread() && wake)
+  uint64_t num = 0;
+  {
+    std::lock_guard lock{external_lock};
+    if (external_num_events > 0 && *external_events.rbegin() == e) {
+      return;
+    }
+    external_events.push_back(e);
+    num = ++external_num_events;
+  }
+  if (num == 1 && !in_thread())
     wakeup();
 
   ldout(cct, 30) << __func__ << " " << e << " pending " << num << dendl;