From b3cede5524bdbd8fa2b6c4ddcbb5e3046de8e1ff Mon Sep 17 00:00:00 2001 From: Patrick Donnelly Date: Tue, 18 Feb 2025 13:46:58 -0500 Subject: [PATCH] osdc/Objecter: convert to ms_dispatch2 for ack Convert ms_dispatch to ms_dispatch2 to enable indicating that a map message is acknowledged and instead of processed (or deliberately not processed). Signed-off-by: Patrick Donnelly (cherry picked from commit f060ee867f5423fd040f658877ad7ef9f57e9ba6) --- src/osdc/Objecter.cc | 49 ++++++++++++++++++++++++++------------------ src/osdc/Objecter.h | 9 ++++---- 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index d881c6e1dc3..3d1e555bbd0 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -981,52 +981,61 @@ void Objecter::_do_watch_notify(boost::intrusive_ptr info, info->finished_async(); } -bool Objecter::ms_dispatch(Message *m) +Dispatcher::dispatch_result_t Objecter::ms_dispatch2(const MessageRef &m) { ldout(cct, 10) << __func__ << " " << cct << " " << *m << dendl; switch (m->get_type()) { // these we exlusively handle case CEPH_MSG_OSD_OPREPLY: - handle_osd_op_reply(static_cast(m)); - return true; + m->get(); /* ref to be consumed */ + handle_osd_op_reply(ref_cast(m).get()); + return Dispatcher::HANDLED(); case CEPH_MSG_OSD_BACKOFF: - handle_osd_backoff(static_cast(m)); - return true; + m->get(); /* ref to be consumed */ + handle_osd_backoff(ref_cast(m).get()); + return Dispatcher::HANDLED(); case CEPH_MSG_WATCH_NOTIFY: - handle_watch_notify(static_cast(m)); - m->put(); - return true; + /* ref not consumed! */ + handle_watch_notify(ref_cast(m).get()); + return Dispatcher::HANDLED(); case MSG_COMMAND_REPLY: if (m->get_source().type() == CEPH_ENTITY_TYPE_OSD) { - handle_command_reply(static_cast(m)); - return true; + m->get(); /* ref to be consumed */ + handle_command_reply(ref_cast(m).get()); + return Dispatcher::HANDLED(); } else { - return false; + return Dispatcher::UNHANDLED(); } case MSG_GETPOOLSTATSREPLY: - handle_get_pool_stats_reply(static_cast(m)); - return true; + m->get(); /* ref to be consumed */ + handle_get_pool_stats_reply(ref_cast(m).get()); + return Dispatcher::HANDLED(); case CEPH_MSG_POOLOP_REPLY: - handle_pool_op_reply(static_cast(m)); - return true; + m->get(); /* ref to be consumed */ + handle_pool_op_reply(ref_cast(m).get()); + return Dispatcher::HANDLED(); case CEPH_MSG_STATFS_REPLY: - handle_fs_stats_reply(static_cast(m)); - return true; + m->get(); /* ref to be consumed */ + handle_fs_stats_reply(ref_cast(m).get()); + return Dispatcher::HANDLED(); // these we give others a chance to inspect // MDS, OSD case CEPH_MSG_OSD_MAP: - handle_osd_map(static_cast(m)); - return false; + /* ref not consumed! */ + handle_osd_map(ref_cast(m).get()); + return Dispatcher::ACKNOWLEDGED(); + + default: + return Dispatcher::UNHANDLED(); } - return false; } void Objecter::_scan_requests( diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index 68bd76268ae..392282516d2 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -2755,7 +2755,8 @@ private: // messages public: - bool ms_dispatch(Message *m) override; + Dispatcher::dispatch_result_t ms_dispatch2(const MessageRef &m) override; + bool ms_can_fast_dispatch_any() const override { return true; } @@ -2768,10 +2769,8 @@ private: return false; } } - void ms_fast_dispatch(Message *m) override { - if (!ms_dispatch(m)) { - m->put(); - } + void ms_fast_dispatch2(const MessageRef& m) override { + [[maybe_unused]] auto s = ms_dispatch2(m); } void handle_osd_op_reply(class MOSDOpReply *m); -- 2.39.5