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) 2016 John Spray <john.spray@redhat.com>
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.
19 #include "msg/msg_types.h"
20 #include "common/Formatter.h"
21 #include "include/encoding.h"
28 std::set<std::string> available_modules;
30 StandbyInfo(uint64_t gid_, const std::string &name_,
31 std::set<std::string>& am)
32 : gid(gid_), name(name_), available_modules(am)
39 void encode(bufferlist& bl) const
41 ENCODE_START(2, 1, bl);
44 ::encode(available_modules, bl);
48 void decode(bufferlist::iterator& p)
54 ::decode(available_modules, p);
59 WRITE_CLASS_ENCODER(StandbyInfo)
66 /// global_id of the ceph-mgr instance selected as a leader
67 uint64_t active_gid = 0;
68 /// server address reported by the leader once it is active
69 entity_addr_t active_addr;
70 /// whether the nominated leader is active (i.e. has initialized its server)
71 bool available = false;
72 /// the name (foo in mgr.<foo>) of the active daemon
73 std::string active_name;
75 std::map<uint64_t, StandbyInfo> standbys;
77 std::set<std::string> modules;
78 std::set<std::string> available_modules;
80 // Map of module name to URI, indicating services exposed by
81 // running modules on the active mgr daemon.
82 std::map<std::string, std::string> services;
84 epoch_t get_epoch() const { return epoch; }
85 entity_addr_t get_active_addr() const { return active_addr; }
86 uint64_t get_active_gid() const { return active_gid; }
87 bool get_available() const { return available; }
88 const std::string &get_active_name() const { return active_name; }
90 bool all_support_module(const std::string& module) {
91 if (!available_modules.count(module)) {
94 for (auto& p : standbys) {
95 if (!p.second.available_modules.count(module)) {
102 bool have_name(const string& name) const {
103 if (active_name == name) {
106 for (auto& p : standbys) {
107 if (p.second.name == name) {
114 std::set<std::string> get_all_names() const {
115 std::set<std::string> ls;
116 if (active_name.size()) {
117 ls.insert(active_name);
119 for (auto& p : standbys) {
120 ls.insert(p.second.name);
125 void encode(bufferlist& bl, uint64_t features) const
127 ENCODE_START(3, 1, bl);
129 ::encode(active_addr, bl, features);
130 ::encode(active_gid, bl);
131 ::encode(available, bl);
132 ::encode(active_name, bl);
133 ::encode(standbys, bl);
134 ::encode(modules, bl);
135 ::encode(available_modules, bl);
136 ::encode(services, bl);
140 void decode(bufferlist::iterator& p)
144 ::decode(active_addr, p);
145 ::decode(active_gid, p);
146 ::decode(available, p);
147 ::decode(active_name, p);
148 ::decode(standbys, p);
150 ::decode(modules, p);
151 ::decode(available_modules, p);
154 ::decode(services, p);
159 void dump(Formatter *f) const {
160 f->dump_int("epoch", epoch);
161 f->dump_int("active_gid", get_active_gid());
162 f->dump_string("active_name", get_active_name());
163 f->dump_stream("active_addr") << active_addr;
164 f->dump_bool("available", available);
165 f->open_array_section("standbys");
166 for (const auto &i : standbys) {
167 f->open_object_section("standby");
168 f->dump_int("gid", i.second.gid);
169 f->dump_string("name", i.second.name);
170 f->open_array_section("available_modules");
171 for (auto& j : i.second.available_modules) {
172 f->dump_string("module", j);
178 f->open_array_section("modules");
179 for (auto& i : modules) {
180 f->dump_string("module", i);
183 f->open_array_section("available_modules");
184 for (auto& j : available_modules) {
185 f->dump_string("module", j);
189 f->open_object_section("services");
190 for (const auto &i : services) {
191 f->dump_string(i.first.c_str(), i.second);
196 static void generate_test_instances(list<MgrMap*> &l) {
197 l.push_back(new MgrMap);
200 void print_summary(Formatter *f, std::ostream *ss) const
202 // One or the other, not both
203 assert((ss != nullptr) != (f != nullptr));
207 if (get_active_gid() != 0) {
208 *ss << get_active_name();
210 // If the daemon hasn't gone active yet, indicate that.
211 *ss << "(active, starting)";
216 *ss << "no daemons active";
218 if (standbys.size()) {
219 *ss << ", standbys: ";
221 for (const auto &i : standbys) {
225 *ss << i.second.name;
232 friend ostream& operator<<(ostream& out, const MgrMap& m) {
234 m.print_summary(nullptr, &ss);
235 return out << ss.str();
239 WRITE_CLASS_ENCODER_FEATURES(MgrMap)