]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr: register OSDs in ms_handle_accept 53189/head
authorPatrick Donnelly <pdonnell@redhat.com>
Mon, 3 Jul 2023 00:48:44 +0000 (20:48 -0400)
committerPatrick Donnelly <pdonnell@redhat.com>
Mon, 28 Aug 2023 13:50:19 +0000 (09:50 -0400)
It's a no-no to acquire locks in these "fast" messenger methods. This
can lead to messenger slow downs in the best case as it's blocking reads
on the wire. In the worse case, the messenger may deadlock with other
threads, preventing any further message reads off the wire.

It's not obvious this method is "fast" so I've added a comment regarding
this.

Fixes: https://tracker.ceph.com/issues/61874
Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
(cherry picked from commit 69980823e62f67d502c4045e15c41c5c44cd5127)

src/mgr/DaemonServer.cc
src/mgr/DaemonServer.h

index b1c1213e03ad5b8e8ef5a64c2640c66037c8f20e..99c568c62ec97bbe9476bd02c47ec4491288c7ba 100644 (file)
@@ -206,16 +206,19 @@ int DaemonServer::ms_handle_fast_authentication(Connection *con)
     dout(10) << " session " << s << " " << s->entity_name
              << " has caps " << s->caps << " '" << str << "'" << dendl;
   }
+  return 1;
+}
 
+void DaemonServer::ms_handle_accept(Connection* con)
+{
   if (con->get_peer_type() == CEPH_ENTITY_TYPE_OSD) {
+    auto s = ceph::ref_cast<MgrSession>(con->get_priv());
     std::lock_guard l(lock);
     s->osd_id = atoi(s->entity_name.get_id().c_str());
     dout(10) << "registering osd." << s->osd_id << " session "
             << s << " con " << con << dendl;
     osd_cons[s->osd_id].insert(con);
   }
-
-  return 1;
 }
 
 bool DaemonServer::ms_handle_reset(Connection *con)
index eaaac41b71cdafb13f07cd01e84bd13ed3d02acc..c647bf95e68ee317a352cd5b700f7db4233c8b6d 100644 (file)
@@ -270,6 +270,7 @@ public:
 
   bool ms_dispatch2(const ceph::ref_t<Message>& m) override;
   int ms_handle_fast_authentication(Connection *con) override;
+  void ms_handle_accept(Connection *con) override;
   bool ms_handle_reset(Connection *con) override;
   void ms_handle_remote_reset(Connection *con) override {}
   bool ms_handle_refused(Connection *con) override;