1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 * Ceph - scalable distributed file system
6 * Copyright (C) 2004-2006 Sage Weil <sage@newdream.net>
8 * This is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License version 2.1, as published by the Free Software
11 * Foundation. See file COPYING.
16 #ifndef CEPH_MMONPROBE_H
17 #define CEPH_MMONPROBE_H
19 #include "include/ceph_features.h"
20 #include "common/ceph_releases.h"
21 #include "msg/Message.h"
22 #include "mon/MonMap.h"
24 class MMonProbe
: public Message
{
26 static constexpr int HEAD_VERSION
= 7;
27 static constexpr int COMPAT_VERSION
= 5;
35 OP_MISSING_FEATURES
= 6,
38 static const char *get_opname(int o
) {
40 case OP_PROBE
: return "probe";
41 case OP_REPLY
: return "reply";
42 case OP_SLURP
: return "slurp";
43 case OP_SLURP_LATEST
: return "slurp_latest";
44 case OP_DATA
: return "data";
45 case OP_MISSING_FEATURES
: return "missing_features";
46 default: ceph_abort(); return 0;
55 version_t paxos_first_version
= 0;
56 version_t paxos_last_version
= 0;
57 bool has_ever_joined
= 0;
58 uint64_t required_features
= 0;
59 ceph_release_t mon_release
{ceph_release_t::unknown
};
62 : Message
{MSG_MON_PROBE
, HEAD_VERSION
, COMPAT_VERSION
} {}
63 MMonProbe(const uuid_d
& f
, int o
, const string
& n
, bool hej
, ceph_release_t mr
)
64 : Message
{MSG_MON_PROBE
, HEAD_VERSION
, COMPAT_VERSION
},
68 paxos_first_version(0),
69 paxos_last_version(0),
74 ~MMonProbe() override
{}
77 std::string_view
get_type_name() const override
{ return "mon_probe"; }
78 void print(ostream
& out
) const override
{
79 out
<< "mon_probe(" << get_opname(op
) << " " << fsid
<< " name " << name
;
81 out
<< " quorum " << quorum
;
84 << " fc " << paxos_first_version
85 << " lc " << paxos_last_version
90 if (required_features
)
91 out
<< " required_features " << required_features
;
92 if (mon_release
!= ceph_release_t::unknown
)
93 out
<< " mon_release " << mon_release
;
97 void encode_payload(uint64_t features
) override
{
99 if (monmap_bl
.length() &&
100 ((features
& CEPH_FEATURE_MONENC
) == 0 ||
101 (features
& CEPH_FEATURE_MSG_ADDR2
) == 0)) {
102 // reencode old-format monmap
106 t
.encode(monmap_bl
, features
);
109 encode(fsid
, payload
);
111 encode(name
, payload
);
112 encode(quorum
, payload
);
113 encode(monmap_bl
, payload
);
114 encode(has_ever_joined
, payload
);
115 encode(paxos_first_version
, payload
);
116 encode(paxos_last_version
, payload
);
117 encode(required_features
, payload
);
118 encode(mon_release
, payload
);
120 void decode_payload() override
{
121 auto p
= payload
.cbegin();
126 decode(monmap_bl
, p
);
127 decode(has_ever_joined
, p
);
128 decode(paxos_first_version
, p
);
129 decode(paxos_last_version
, p
);
130 if (header
.version
>= 6)
131 decode(required_features
, p
);
133 required_features
= 0;
134 if (header
.version
>= 7)
135 decode(mon_release
, p
);
137 mon_release
= ceph_release_t::unknown
;
140 template<class T
, typename
... Args
>
141 friend boost::intrusive_ptr
<T
> ceph::make_message(Args
&&... args
);