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)
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;
}
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;}