]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
msg: insert PriorityDispatchers in sorted position 58991/head
authorCasey Bodley <cbodley@redhat.com>
Tue, 16 Jul 2024 21:37:18 +0000 (17:37 -0400)
committerCasey Bodley <cbodley@redhat.com>
Thu, 1 Aug 2024 13:52:42 +0000 (09:52 -0400)
avoid calling stable_sort() after every insertion by inserting directly
into the sorted position. use lower_bound() to insert at the head and
upper_bound() to insert at the tail

this generally only happens during startup so isn't a performance
problem, but std::stable_sort() was triggering strange valgrind warnings
for "Mismatched free() / delete / delete []" when it allocates a
temporary buffer

Fixes: https://tracker.ceph.com/issues/66336
Signed-off-by: Casey Bodley <cbodley@redhat.com>
(cherry picked from commit 063d100526e9e5ece31d575568e0910806f8e74d)

src/msg/Messenger.h

index 830ae9050bba7d38147e6815b62f55b79386a589..078418fe715fce45674f2fb157f02cd8db9da2de 100644 (file)
@@ -106,6 +106,17 @@ private:
 
   ZTracer::Endpoint trace_endpoint;
 
+  static void insert_head(std::vector<PriorityDispatcher>& v,
+                          PriorityDispatcher d)
+  {
+    v.insert(std::lower_bound(v.begin(), v.end(), d), d);
+  }
+  static void insert_tail(std::vector<PriorityDispatcher>& v,
+                          PriorityDispatcher d)
+  {
+    v.insert(std::upper_bound(v.begin(), v.end(), d), d);
+  }
+
 protected:
   void set_endpoint_addr(const entity_addr_t& a,
                          const entity_name_t &name);
@@ -401,11 +412,10 @@ public:
    */
   void add_dispatcher_head(Dispatcher *d, PriorityDispatcher::priority_t priority=Dispatcher::PRIORITY_DEFAULT) {
     bool first = dispatchers.empty();
-    dispatchers.insert(dispatchers.begin(), PriorityDispatcher{priority, d});
-    std::stable_sort(dispatchers.begin(), dispatchers.end());
+    const PriorityDispatcher entry{priority, d};
+    insert_head(dispatchers, entry);
     if (d->ms_can_fast_dispatch_any()) {
-      fast_dispatchers.insert(fast_dispatchers.begin(), PriorityDispatcher{priority, d});
-      std::stable_sort(fast_dispatchers.begin(), fast_dispatchers.end());
+      insert_head(fast_dispatchers, entry);
     }
     if (first)
       ready();
@@ -419,11 +429,10 @@ public:
    */
   void add_dispatcher_tail(Dispatcher *d, PriorityDispatcher::priority_t priority=Dispatcher::PRIORITY_DEFAULT) {
     bool first = dispatchers.empty();
-    dispatchers.push_back(PriorityDispatcher{priority, d});
-    std::stable_sort(dispatchers.begin(), dispatchers.end());
+    const PriorityDispatcher entry{priority, d};
+    insert_tail(dispatchers, entry);
     if (d->ms_can_fast_dispatch_any()) {
-      fast_dispatchers.push_back(PriorityDispatcher{priority, d});
-      std::stable_sort(fast_dispatchers.begin(), fast_dispatchers.end());
+      insert_tail(fast_dispatchers, entry);
     }
     if (first)
       ready();