From: Patrick Donnelly Date: Mon, 12 Aug 2024 18:48:24 +0000 (-0400) Subject: mds: encode quiesce payload on demand X-Git-Tag: testing/wip-rishabh-testing-20240908.191426-squid-debug~3^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a4b16ad847762ac1874877b23c9fb67f6c542dca;p=ceph-ci.git mds: encode quiesce payload on demand Leonid was trying to avoid re-marshalling the data multiple times or extra data copies. Unfortunately, the messenger interface requires that a payload can be recomputed for message retries. See ProtocolV2::requeue_sent. We can keep decode optimized because the payload bufferlist won't change once the message is received. Fixes: https://tracker.ceph.com/issues/67406 Signed-off-by: Patrick Donnelly (cherry picked from commit 3f48bcdb6173c6929ad0234b623334e6dafe3f63) --- diff --git a/src/mds/MDSRankQuiesce.cc b/src/mds/MDSRankQuiesce.cc index 0071cd8fa59..ba854cfd086 100644 --- a/src/mds/MDSRankQuiesce.cc +++ b/src/mds/MDSRankQuiesce.cc @@ -283,9 +283,8 @@ void MDSRank::quiesce_cluster_update() { } auto addrs = mdsmap->get_info_gid(membership.leader).addrs; - auto ack_msg = make_message(); + auto ack_msg = make_message(QuiesceDbPeerAck{me, std::move(ack)}); dout(10) << "sending ack " << ack << " to the leader " << membership.leader << dendl; - ack_msg->encode_payload_from({me, std::move(ack)}); return send_message_mds(ack_msg, addrs); } }; @@ -297,9 +296,8 @@ void MDSRank::quiesce_cluster_update() { return -ENOENT; } auto addrs = mdsmap->get_info_gid(to).addrs; - auto listing_msg = make_message(); + auto listing_msg = make_message(QuiesceDbPeerListing{me, std::move(db)}); dout(10) << "sending listing " << db << " to the peer " << to << dendl; - listing_msg->encode_payload_from({me, std::move(db)}); return send_message_mds(listing_msg, addrs); }; } diff --git a/src/messages/MMDSQuiesceDbAck.h b/src/messages/MMDSQuiesceDbAck.h index fcbca483b0d..270802268a4 100644 --- a/src/messages/MMDSQuiesceDbAck.h +++ b/src/messages/MMDSQuiesceDbAck.h @@ -21,6 +21,10 @@ class MMDSQuiesceDbAck final : public MMDSOp { protected: MMDSQuiesceDbAck() : MMDSOp{MSG_MDS_QUIESCE_DB_ACK} {} + MMDSQuiesceDbAck(auto&& _ack) + : MMDSOp{MSG_MDS_QUIESCE_DB_ACK} + , ack(std::forward(_ack)) + {} ~MMDSQuiesceDbAck() final {} public: @@ -30,11 +34,6 @@ public: } void encode_payload(uint64_t features) override - { - // noop to prevent unnecessary overheads - } - - void encode_payload_from(QuiesceDbPeerAck const& ack) { ::encode(ack, payload); } @@ -43,10 +42,10 @@ public: // noop to prevent unnecessary overheads } - void decode_payload_into(QuiesceDbPeerAck &ack) const + void decode_payload_into(QuiesceDbPeerAck &_ack) const { auto p = payload.cbegin(); - ::decode(ack, p); + ::decode(_ack, p); } private: @@ -54,4 +53,6 @@ private: friend boost::intrusive_ptr ceph::make_message(Args&&... args); template friend MURef crimson::make_message(Args&&... args); + + QuiesceDbPeerAck ack; }; diff --git a/src/messages/MMDSQuiesceDbListing.h b/src/messages/MMDSQuiesceDbListing.h index 1c065379136..b3be5bb8f22 100644 --- a/src/messages/MMDSQuiesceDbListing.h +++ b/src/messages/MMDSQuiesceDbListing.h @@ -21,6 +21,10 @@ class MMDSQuiesceDbListing final : public MMDSOp { protected: MMDSQuiesceDbListing() : MMDSOp{MSG_MDS_QUIESCE_DB_LISTING} {} + MMDSQuiesceDbListing(auto&& _pl) + : MMDSOp{MSG_MDS_QUIESCE_DB_LISTING} + , peer_listing(std::forward(_pl)) + {} ~MMDSQuiesceDbListing() final {} public: @@ -30,11 +34,6 @@ public: } void encode_payload(uint64_t features) override { - // noop to prevent unnecessary overheads - } - - void encode_payload_from(QuiesceDbPeerListing const& peer_listing) - { ::encode(peer_listing, payload); } @@ -42,10 +41,10 @@ public: // noop to prevent unnecessary overheads } - void decode_payload_into(QuiesceDbPeerListing &peer_listing) const + void decode_payload_into(QuiesceDbPeerListing &pl) const { auto p = payload.cbegin(); - ::decode(peer_listing, p); + ::decode(pl, p); } private: @@ -53,4 +52,6 @@ private: friend boost::intrusive_ptr ceph::make_message(Args&&... args); template friend MURef crimson::make_message(Args&&... args); + + QuiesceDbPeerListing peer_listing; };