From: Sage Weil Date: Wed, 5 Jul 2017 21:32:36 +0000 (-0400) Subject: mon: keep mon metadata in ram X-Git-Tag: v12.1.1~133^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b47db49b5a539a4ed1cb37d9867edd7fc027ac59;p=ceph.git mon: keep mon metadata in ram Signed-off-by: Sage Weil --- diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index ded7ed253eef..ccf0b751d332 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -846,6 +846,7 @@ void Monitor::refresh_from_paxos(bool *need_bootstrap) for (int i = 0; i < PAXOS_NUM; ++i) { paxos_service[i]->post_refresh(); } + load_metadata(); } void Monitor::register_cluster_logger() @@ -4712,48 +4713,36 @@ void Monitor::handle_mon_metadata(MonOpRequestRef op) void Monitor::update_mon_metadata(int from, Metadata&& m) { - pending_metadata.insert(make_pair(from, std::move(m))); - - bufferlist bl; - int err = store->get(MONITOR_STORE_PREFIX, "last_metadata", bl); - map last_metadata; - if (!err) { - bufferlist::iterator iter = bl.begin(); - ::decode(last_metadata, iter); - pending_metadata.insert(last_metadata.begin(), last_metadata.end()); - } + pending_metadata[from] = std::move(m); MonitorDBStore::TransactionRef t = paxos->get_pending_transaction(); - bl.clear(); + bufferlist bl; ::encode(pending_metadata, bl); t->put(MONITOR_STORE_PREFIX, "last_metadata", bl); paxos->trigger_propose(); } -int Monitor::load_metadata(map& metadata) +int Monitor::load_metadata() { bufferlist bl; int r = store->get(MONITOR_STORE_PREFIX, "last_metadata", bl); if (r) return r; bufferlist::iterator it = bl.begin(); - ::decode(metadata, it); + ::decode(mon_metadata, it); + + pending_metadata = mon_metadata; return 0; } int Monitor::get_mon_metadata(int mon, Formatter *f, ostream& err) { assert(f); - map last_metadata; - if (int r = load_metadata(last_metadata)) { - err << "Unable to load metadata: " << cpp_strerror(r); - return r; - } - if (!last_metadata.count(mon)) { + if (!mon_metadata.count(mon)) { err << "mon." << mon << " not found"; return -EINVAL; } - const Metadata& m = last_metadata[mon]; + const Metadata& m = mon_metadata[mon]; for (Metadata::const_iterator p = m.begin(); p != m.end(); ++p) { f->dump_string(p->first.c_str(), p->second); } @@ -4762,10 +4751,8 @@ int Monitor::get_mon_metadata(int mon, Formatter *f, ostream& err) void Monitor::count_metadata(const string& field, Formatter *f) { - map meta; - load_metadata(meta); map by_val; - for (auto& p : meta) { + for (auto& p : mon_metadata) { auto q = p.second.find(field); if (q == p.second.end()) { by_val["unknown"]++; @@ -4782,15 +4769,9 @@ void Monitor::count_metadata(const string& field, Formatter *f) int Monitor::print_nodes(Formatter *f, ostream& err) { - map metadata; - if (int r = load_metadata(metadata)) { - err << "Unable to load metadata.\n"; - return r; - } - map > mons; // hostname => mon - for (map::iterator it = metadata.begin(); - it != metadata.end(); ++it) { + for (map::iterator it = mon_metadata.begin(); + it != mon_metadata.end(); ++it) { const Metadata& m = it->second; Metadata::const_iterator hostname = m.find("hostname"); if (hostname == m.end()) { diff --git a/src/mon/Monitor.h b/src/mon/Monitor.h index 30f7ae852eb8..b5f87708ed1b 100644 --- a/src/mon/Monitor.h +++ b/src/mon/Monitor.h @@ -696,6 +696,7 @@ public: int print_nodes(Formatter *f, ostream& err); // Accumulate metadata across calls to update_mon_metadata + map mon_metadata; map pending_metadata; /** @@ -878,7 +879,7 @@ public: void collect_metadata(Metadata *m); void update_mon_metadata(int from, Metadata&& m); - int load_metadata(map& m); + int load_metadata(); void count_metadata(const string& field, Formatter *f); // features