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)
}
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);
}
};
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);
};
}
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:
}
void encode_payload(uint64_t features) override
- {
- // noop to prevent unnecessary overheads
- }
-
- void encode_payload_from(QuiesceDbPeerAck const& ack)
{
::encode(ack, payload);
}
// 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:
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;
};
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:
}
void encode_payload(uint64_t features) override {
- // noop to prevent unnecessary overheads
- }
-
- void encode_payload_from(QuiesceDbPeerListing const& peer_listing)
- {
::encode(peer_listing, payload);
}
// 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:
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;
};