From 9c0e32db4ea45d91f9c4b464fab51d5a324569da Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Mon, 22 Mar 2021 21:26:58 +0000 Subject: [PATCH] mon: messages: Extend MMonJoin so it can provide a crush_location on join This will let newly-created monitors auto-join on startup in stretch mode, by providing the needed location. Signed-off-by: Greg Farnum --- src/messages/MMonJoin.h | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/messages/MMonJoin.h b/src/messages/MMonJoin.h index 027f696cf2b02..008617c555d66 100644 --- a/src/messages/MMonJoin.h +++ b/src/messages/MMonJoin.h @@ -19,18 +19,30 @@ class MMonJoin final : public PaxosServiceMessage { public: - static constexpr int HEAD_VERSION = 2; + static constexpr int HEAD_VERSION = 3; static constexpr int COMPAT_VERSION = 2; uuid_d fsid; std::string name; entity_addrvec_t addrs; + /* The location members are for stretch mode. crush_loc is the location + * (generally just a "datacenter=" statement) of the monitor. The + * force_loc is whether the mon cluster should replace a previously-known + * location. Generally the monitor will force an update if it's given a + * location from the CLI on boot-up, and then never force again (so that it + * can be moved/updated via the ceph tool from elsewhere). */ + map crush_loc; + bool force_loc{false}; MMonJoin() : PaxosServiceMessage{MSG_MON_JOIN, 0, HEAD_VERSION, COMPAT_VERSION} {} MMonJoin(uuid_d &f, std::string n, const entity_addrvec_t& av) : PaxosServiceMessage{MSG_MON_JOIN, 0, HEAD_VERSION, COMPAT_VERSION}, fsid(f), name(n), addrs(av) { } + MMonJoin(uuid_d &f, std::string n, const entity_addrvec_t& av, const map& cloc, bool force) + : PaxosServiceMessage{MSG_MON_JOIN, 0, HEAD_VERSION, COMPAT_VERSION}, + fsid(f), name(n), addrs(av), crush_loc(cloc), force_loc(force) + { } private: ~MMonJoin() final {} @@ -38,7 +50,7 @@ private: public: std::string_view get_type_name() const override { return "mon_join"; } void print(std::ostream& o) const override { - o << "mon_join(" << name << " " << addrs << ")"; + o << "mon_join(" << name << " " << addrs << " " << crush_loc << ")"; } void encode_payload(uint64_t features) override { @@ -50,6 +62,8 @@ public: header.version = HEAD_VERSION; header.compat_version = COMPAT_VERSION; encode(addrs, payload, features); + encode(crush_loc, payload); + encode(force_loc, payload); } void decode_payload() override { using ceph::decode; @@ -59,6 +73,10 @@ public: decode(name, p); assert(header.version > 1); decode(addrs, p); + if (header.version >= 3) { + decode(crush_loc, p); + decode(force_loc, p); + } } }; -- 2.39.5