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 final
: public Message
{
26 static constexpr int HEAD_VERSION
= 8;
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;
53 std::set
<int32_t> quorum
;
55 ceph::buffer::list monmap_bl
;
56 version_t paxos_first_version
= 0;
57 version_t paxos_last_version
= 0;
58 bool has_ever_joined
= 0;
59 uint64_t required_features
= 0;
60 ceph_release_t mon_release
{ceph_release_t::unknown
};
63 : Message
{MSG_MON_PROBE
, HEAD_VERSION
, COMPAT_VERSION
} {}
64 MMonProbe(const uuid_d
& f
, int o
, const std::string
& n
, bool hej
, ceph_release_t mr
)
65 : Message
{MSG_MON_PROBE
, HEAD_VERSION
, COMPAT_VERSION
},
69 paxos_first_version(0),
70 paxos_last_version(0),
78 std::string_view
get_type_name() const override
{ return "mon_probe"; }
79 void print(std::ostream
& out
) const override
{
80 out
<< "mon_probe(" << get_opname(op
) << " " << fsid
<< " name " << name
;
82 out
<< " quorum " << quorum
;
83 out
<< " leader " << leader
;
86 << " fc " << paxos_first_version
87 << " lc " << paxos_last_version
92 if (required_features
)
93 out
<< " required_features " << required_features
;
94 if (mon_release
!= ceph_release_t::unknown
)
95 out
<< " mon_release " << mon_release
;
99 void encode_payload(uint64_t features
) override
{
101 if (monmap_bl
.length() &&
102 ((features
& CEPH_FEATURE_MONENC
) == 0 ||
103 (features
& CEPH_FEATURE_MSG_ADDR2
) == 0)) {
104 // reencode old-format monmap
108 t
.encode(monmap_bl
, features
);
111 encode(fsid
, payload
);
113 encode(name
, payload
);
114 encode(quorum
, payload
);
115 encode(monmap_bl
, payload
);
116 encode(has_ever_joined
, payload
);
117 encode(paxos_first_version
, payload
);
118 encode(paxos_last_version
, payload
);
119 encode(required_features
, payload
);
120 encode(mon_release
, payload
);
121 encode(leader
, payload
);
123 void decode_payload() override
{
125 auto p
= payload
.cbegin();
130 decode(monmap_bl
, p
);
131 decode(has_ever_joined
, p
);
132 decode(paxos_first_version
, p
);
133 decode(paxos_last_version
, p
);
134 if (header
.version
>= 6)
135 decode(required_features
, p
);
137 required_features
= 0;
138 if (header
.version
>= 7)
139 decode(mon_release
, p
);
141 mon_release
= ceph_release_t::unknown
;
142 if (header
.version
>= 8) {
144 } else if (quorum
.size()) {
145 leader
= *quorum
.begin();
149 template<class T
, typename
... Args
>
150 friend boost::intrusive_ptr
<T
> ceph::make_message(Args
&&... args
);