26
26
epoch_t epoch; // what epoch/version of the monmap
28
vector<entity_inst_t> mon_inst;
28
map<string, entity_addr_t> mon_addr;
29
29
utime_t last_changed;
32
vector<string> rank_name;
33
vector<entity_addr_t> rank_addr;
36
rank_name.resize(mon_addr.size());
37
rank_addr.resize(mon_addr.size());
39
for (map<string,entity_addr_t>::iterator p = mon_addr.begin();
42
rank_name[i] = p->first;
43
rank_addr[i] = p->second;
32
47
MonMap() : epoch(0) {
33
48
memset(&fsid, 0, sizeof(fsid));
34
49
last_changed = created = g_clock.now();
37
52
ceph_fsid_t& get_fsid() { return fsid; }
40
return mon_inst.size();
55
return mon_addr.size();
58
const string& pick_random_mon() {
59
unsigned n = rand() % rank_name.size();
62
const string& pick_random_mon_not(const string& butnot) {
63
unsigned n = rand() % rank_name.size();
64
if (rank_name[n] == butnot && rank_name.size() > 1) {
43
73
epoch_t get_epoch() { return epoch; }
45
void add_mon(entity_inst_t inst) {
46
mon_inst.push_back(inst);
49
void add(entity_addr_t a) {
52
i.name = entity_name_t::MON(mon_inst.size());
53
mon_inst.push_back(i);
55
bool remove(entity_addr_t a) {
56
for (unsigned i=0; i<mon_inst.size(); i++) {
57
if (mon_inst[i].addr == a) {
58
for (; i < mon_inst.size()-1; i++)
59
mon_inst[i].addr = mon_inst[i+1].addr;
75
void add(string name, entity_addr_t addr) {
76
assert(mon_addr.count(name) == 0);
77
mon_addr[name] = addr;
81
void remove(string name) {
82
assert(mon_addr.count(name));
87
bool contains(const string& name) {
88
return mon_addr.count(name);
66
91
bool contains(entity_addr_t a) {
67
for (unsigned i=0; i<mon_inst.size(); i++)
68
if (mon_inst[i].addr == a)
73
const entity_inst_t &get_inst(unsigned m) {
74
assert(m < mon_inst.size());
92
for (map<string,entity_addr_t>::iterator p = mon_addr.begin();
100
int get_rank(const string& n) {
101
for (unsigned i=0; i<rank_name.size(); i++)
102
if (rank_name[i] == n)
106
bool get_addr_name(entity_addr_t a, string& name) {
107
for (map<string,entity_addr_t>::iterator p = mon_addr.begin();
110
if (p->second == a) {
117
const entity_addr_t& get_addr(const string& n) {
118
assert(mon_addr.count(n));
121
const entity_addr_t& get_addr(unsigned m) {
122
assert(m < rank_addr.size());
125
entity_inst_t get_inst(const string& n) {
126
assert(mon_addr.count(n));
129
i.addr = rank_addr[m];
130
i.name = entity_name_t::MON(m);
133
entity_inst_t get_inst(unsigned m) {
134
assert(m < rank_addr.size());
136
i.addr = rank_addr[m];
137
i.name = entity_name_t::MON(m);
78
141
void encode(bufferlist& blist) {
144
::encode_raw(fsid, blist);
145
::encode(epoch, blist);
146
::encode(mon_addr, blist);
147
::encode(last_changed, blist);
148
::encode(created, blist);
150
void encode_v1(bufferlist& blist) {
80
152
::encode(v, blist);
81
153
::encode_raw(fsid, blist);
82
154
::encode(epoch, blist);
155
vector<entity_inst_t> mon_inst(mon_addr.size());
156
for (unsigned n = 0; n < mon_addr.size(); n++)
157
mon_inst[n] = get_inst(n);
83
158
::encode(mon_inst, blist);
84
159
::encode(last_changed, blist);
85
160
::encode(created, blist);
87
163
void decode(bufferlist& blist) {
88
164
bufferlist::iterator p = blist.begin();