From 7fc04be9332704946ba6f0e95cfcd1afc34fc0fe Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Fri, 10 Aug 2018 17:34:01 +0800 Subject: [PATCH] mds: use fast dispatch to handle MDSBeacon 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" --- src/mds/Beacon.cc | 12 ++++++++++++ src/mds/Beacon.h | 3 +++ 2 files changed, 15 insertions(+) diff --git a/src/mds/Beacon.cc b/src/mds/Beacon.cc index 27c7d5a2d8fda..412e4f34b13a3 100644 --- a/src/mds/Beacon.cc +++ b/src/mds/Beacon.cc @@ -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(m)); + } else { + m->put(); } return true; } diff --git a/src/mds/Beacon.h b/src/mds/Beacon.h index f176588dd324f..1bcbf85d45d03 100644 --- a/src/mds/Beacon.h +++ b/src/mds/Beacon.h @@ -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;} -- 2.39.5