// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- // vim: ts=8 sw=2 smarttab /* * Ceph - scalable distributed file system * * Copyright (C) 2004-2006 Sage Weil * * This is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software * Foundation. See file COPYING. * */ #ifndef CEPH_MONMAP_H #define CEPH_MONMAP_H #include "include/err.h" #include "msg/Message.h" #include "include/types.h" //#include "common/config.h" namespace ceph { class Formatter; } class MonMap { public: epoch_t epoch; // what epoch/version of the monmap uuid_d fsid; map mon_addr; utime_t last_changed; utime_t created; map addr_name; vector rank_name; vector rank_addr; void calc_ranks() { rank_name.resize(mon_addr.size()); rank_addr.resize(mon_addr.size()); addr_name.clear(); for (map::iterator p = mon_addr.begin(); p != mon_addr.end(); p++) { assert(addr_name.count(p->second) == 0); addr_name[p->second] = p->first; } unsigned i = 0; for (map::iterator p = addr_name.begin(); p != addr_name.end(); p++, i++) { rank_name[i] = p->second; rank_addr[i] = p->first; } } MonMap() : epoch(0) { memset(&fsid, 0, sizeof(fsid)); } uuid_d& get_fsid() { return fsid; } unsigned size() { return mon_addr.size(); } const string& pick_random_mon() { unsigned n = rand() % rank_name.size(); return rank_name[n]; } const string& pick_random_mon_not(const string& butnot) { unsigned n = rand() % rank_name.size(); if (rank_name[n] == butnot && rank_name.size() > 1) { if (n) n--; else n++; } return rank_name[n]; } epoch_t get_epoch() { return epoch; } void set_epoch(epoch_t e) { epoch = e; } void list_addrs(list& ls) const { for (map::const_iterator p = mon_addr.begin(); p != mon_addr.end(); ++p) ls.push_back(p->second); } void add(const string &name, const entity_addr_t &addr) { assert(mon_addr.count(name) == 0); assert(addr_name.count(addr) == 0); mon_addr[name] = addr; calc_ranks(); } void remove(const string &name) { assert(mon_addr.count(name)); mon_addr.erase(name); calc_ranks(); } void rename(string oldname, string newname) { assert(contains(oldname)); assert(!contains(newname)); mon_addr[newname] = mon_addr[oldname]; mon_addr.erase(oldname); calc_ranks(); } bool contains(const string& name) { return mon_addr.count(name); } bool contains(const entity_addr_t &a) { for (map::iterator p = mon_addr.begin(); p != mon_addr.end(); p++) if (p->second == a) return true; return false; } string get_name(unsigned n) const { assert(n < rank_name.size()); return rank_name[n]; } string get_name(entity_addr_t a) const { map::const_iterator p = addr_name.find(a); if (p == addr_name.end()) return string(); else return p->second; } int get_rank(const string& n) { for (unsigned i=0; i& initial_members, string my_name, entity_addr_t my_addr, set *removed); void print(ostream& out) const; void print_summary(ostream& out) const; void dump(ceph::Formatter *f) const; static void generate_test_instances(list& o); }; WRITE_CLASS_ENCODER_FEATURES(MonMap) inline ostream& operator<<(ostream& out, MonMap& m) { m.print_summary(out); return out; } #endif