#ifndef CEPH_PAXOSSERVICEMESSAGE_H #define CEPH_PAXOSSERVICEMESSAGE_H #include "msg/Message.h" #include "mon/Session.h" class PaxosServiceMessage : public Message { public: version_t version; __s16 deprecated_session_mon; uint64_t deprecated_session_mon_tid; // track which epoch the leader received a forwarded request in, so we can // discard forwarded requests appropriately on election boundaries. epoch_t rx_election_epoch; PaxosServiceMessage() : Message(MSG_PAXOS), version(0), deprecated_session_mon(-1), deprecated_session_mon_tid(0), rx_election_epoch(0) { } PaxosServiceMessage(int type, version_t v, int enc_version=1, int compat_enc_version=0) : Message(type, enc_version, compat_enc_version), version(v), deprecated_session_mon(-1), deprecated_session_mon_tid(0), rx_election_epoch(0) { } protected: ~PaxosServiceMessage() override {} public: void paxos_encode() { ::encode(version, payload); ::encode(deprecated_session_mon, payload); ::encode(deprecated_session_mon_tid, payload); } void paxos_decode( bufferlist::iterator& p ) { ::decode(version, p); ::decode(deprecated_session_mon, p); ::decode(deprecated_session_mon_tid, p); } void encode_payload(uint64_t features) override { ceph_abort(); paxos_encode(); } void decode_payload() override { ceph_abort(); bufferlist::iterator p = payload.begin(); paxos_decode(p); } /** * These messages are only used by the monitors and clients, * and the client doesn't care, so we're creating a monitor-specific * function here. Note that this function explicitly exists to bypass * the normal ref-counting, so don't expect the returned pointer to be * very long-lived -- it will still only last as long as the Session would * normally. */ MonSession *get_session() { MonSession *session = (MonSession *)get_connection()->get_priv(); if (session) session->put(); return session; } const char *get_type_name() const override { return "PaxosServiceMessage"; } }; #endif