]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: use fast dispatch to handle MDSBeacon 23703/head
authorYan, Zheng <zyan@redhat.com>
Fri, 10 Aug 2018 09:34:01 +0000 (17:34 +0800)
committerPrashant D <pdhange@redhat.com>
Thu, 23 Aug 2018 01:46:28 +0000 (21:46 -0400)
Current mds handles MDSBeacon messages through MDSRank::ms_dispatch().
MDSRank::ms_dispatch() locks mds_lock at the very beginning. This means
that long running task (such as processing finished contexts) can delay
MMDSBeacon. Using fast dispatch for MDSBeacon can avoid this issue.

Fixes: http://tracker.ceph.com/issues/23519
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
(cherry picked from commit 7fc04be9332704946ba6f0e95cfcd1afc34fc0fe)

src/mds/Beacon.cc
src/mds/Beacon.h

index 94cd8ea6fd22248d08e1d088c5e9b2bab2dbca3e..7bd58e163c55ea35b4e80ae9cc7de4796e8358bf 100644 (file)
@@ -79,12 +79,24 @@ void Beacon::shutdown()
   timer.shutdown();
 }
 
+bool Beacon::ms_can_fast_dispatch(const Message *m) const
+{
+  return m->get_type() == MSG_MDS_BEACON;
+}
+
+void Beacon::ms_fast_dispatch(Message *m)
+{
+  bool handled = ms_dispatch(m);
+  assert(handled);
+}
 
 bool Beacon::ms_dispatch(Message *m)
 {
   if (m->get_type() == MSG_MDS_BEACON) {
     if (m->get_connection()->get_peer_type() == CEPH_ENTITY_TYPE_MON) {
       handle_mds_beacon(static_cast<MMDSBeacon*>(m));
+    } else {
+      m->put();
     }
     return true;
   }
index f176588dd324f619500e30876c419f104477d74e..1bcbf85d45d0398cdc69db3183bbfdd50915e35e 100644 (file)
@@ -48,6 +48,9 @@ public:
   void init(MDSMap const *mdsmap);
   void shutdown();
 
+  bool ms_can_fast_dispatch_any() const override { return true; }
+  bool ms_can_fast_dispatch(const Message *m) const override;
+  void ms_fast_dispatch(Message *m) override;
   bool ms_dispatch(Message *m) override;
   void ms_handle_connect(Connection *c) override {}
   bool ms_handle_reset(Connection *c) override {return false;}