]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mds: encode quiesce payload on demand
authorPatrick Donnelly <pdonnell@redhat.com>
Mon, 12 Aug 2024 18:48:24 +0000 (14:48 -0400)
committerPatrick Donnelly <pdonnell@redhat.com>
Thu, 29 Aug 2024 20:23:01 +0000 (16:23 -0400)
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 <pdonnell@redhat.com>
(cherry picked from commit 3f48bcdb6173c6929ad0234b623334e6dafe3f63)

src/mds/MDSRankQuiesce.cc
src/messages/MMDSQuiesceDbAck.h
src/messages/MMDSQuiesceDbListing.h

index 0071cd8fa5990afa557c7032ff0b27110ac76295..ba854cfd0865e6764ee81ed620c397e1505e63f9 100644 (file)
@@ -283,9 +283,8 @@ void MDSRank::quiesce_cluster_update() {
         }
         auto addrs = mdsmap->get_info_gid(membership.leader).addrs;
 
-        auto ack_msg = make_message<MMDSQuiesceDbAck>();
+        auto ack_msg = make_message<MMDSQuiesceDbAck>(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<MMDSQuiesceDbListing>();
+      auto listing_msg = make_message<MMDSQuiesceDbListing>(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);
     };
   }
index fcbca483b0dfdbc04d40b896a435e16b3451908a..270802268a416bfdcc4f0ec430012a81e3212210 100644 (file)
 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<decltype(_ack)>(_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<T> ceph::make_message(Args&&... args);
   template<class T, typename... Args>
   friend MURef<T> crimson::make_message(Args&&... args);
+
+  QuiesceDbPeerAck ack;
 };
index 1c065379136f3d6a3cb2763ac7f3ab6917ac272f..b3be5bb8f22aab1d30b344a4ab8d70119d5fe5a0 100644 (file)
 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<decltype(_pl)>(_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<T> ceph::make_message(Args&&... args);
   template<class T, typename... Args>
   friend MURef<T> crimson::make_message(Args&&... args);
+
+  QuiesceDbPeerListing peer_listing;
 };