From fc0f6db92021c204803c6d3ada7fc7ef03c31b96 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 7 Nov 2008 13:07:28 -0800 Subject: [PATCH] mon: avoid updating pg_map when osd_stat is unchanged --- src/mon/PGMonitor.cc | 49 ++++++++++++++++++++++---------------------- src/mon/PGMonitor.h | 1 + src/osd/osd_types.h | 13 ++++++++++++ 3 files changed, 39 insertions(+), 24 deletions(-) diff --git a/src/mon/PGMonitor.cc b/src/mon/PGMonitor.cc index 0bd09ab4b1980..57fde32acc3b2 100644 --- a/src/mon/PGMonitor.cc +++ b/src/mon/PGMonitor.cc @@ -185,30 +185,7 @@ bool PGMonitor::preprocess_query(Message *m) return true; case MSG_PGSTATS: - { - MPGStats *stats = (MPGStats*)m; - - int from = m->get_orig_source().num(); - if (pg_map.osd_stat.count(from) || - memcmp(&pg_map.osd_stat[from], &stats->osd_stat, sizeof(stats->osd_stat)) != 0) - return false; // new osd stat - for (map::iterator p = stats->pg_stat.begin(); - p != stats->pg_stat.end(); - p++) { - if (pg_map.pg_stat.count(p->first) == 0 || - memcmp(&pg_map.pg_stat[p->first], &p->second, sizeof(p->second)) != 0) - return false; // new pg stat(s) - } - - dout(10) << " message contains no new osd|pg stats" << dendl; - MPGStatsAck *ack = new MPGStatsAck; - for (map::iterator p = stats->pg_stat.begin(); - p != stats->pg_stat.end(); - p++) - ack->pg_stat[p->first] = p->second.version; - mon->messenger->send_message(ack, stats->get_orig_source_inst()); - return true; - } + return preprocess_pg_stats((MPGStats*)m); case MSG_MON_COMMAND: return preprocess_command((MMonCommand*)m); @@ -268,6 +245,30 @@ void PGMonitor::handle_statfs(MStatfs *statfs) delete statfs; } +bool PGMonitor::preprocess_pg_stats(MPGStats *stats) +{ + int from = stats->get_orig_source().num(); + if (pg_map.osd_stat.count(from) || + pg_map.osd_stat[from] != stats->osd_stat) + return false; // new osd stat + for (map::iterator p = stats->pg_stat.begin(); + p != stats->pg_stat.end(); + p++) { + if (pg_map.pg_stat.count(p->first) == 0 || + memcmp(&pg_map.pg_stat[p->first], &p->second, sizeof(p->second)) != 0) + return false; // new pg stat(s) + } + + dout(10) << " message contains no new osd|pg stats" << dendl; + MPGStatsAck *ack = new MPGStatsAck; + for (map::iterator p = stats->pg_stat.begin(); + p != stats->pg_stat.end(); + p++) + ack->pg_stat[p->first] = p->second.version; + mon->messenger->send_message(ack, stats->get_orig_source_inst()); + return true; +} + bool PGMonitor::prepare_pg_stats(MPGStats *stats) { dout(10) << "prepare_pg_stats " << *stats << " from " << stats->get_orig_source() << dendl; diff --git a/src/mon/PGMonitor.h b/src/mon/PGMonitor.h index 4878595150734..d8b0005f4d3ab 100644 --- a/src/mon/PGMonitor.h +++ b/src/mon/PGMonitor.h @@ -52,6 +52,7 @@ private: bool preprocess_query(Message *m); // true if processed. bool prepare_update(Message *m); + bool preprocess_pg_stats(MPGStats *stats); bool prepare_pg_stats(MPGStats *stats); void _updated_stats(MPGStatsAck *ack, entity_inst_t who); diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index f09bf05e61f28..e51ea859e8fbe 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -269,6 +269,19 @@ struct osd_stat_t { }; WRITE_CLASS_ENCODER(osd_stat_t) +inline bool operator==(const osd_stat_t& l, const osd_stat_t& r) { + return l.kb == r.kb && + l.kb_used == r.kb_used && + l.kb_avail == r.kb_avail && + l.num_objects == r.num_objects && + l.hb_in == r.hb_in && + l.hb_out == r.hb_out; +} +inline bool operator!=(const osd_stat_t& l, const osd_stat_t& r) { + return !(l == r); +} + + inline ostream& operator<<(ostream& out, const osd_stat_t& s) { return out << "osd_stat(" << (s.kb_used) << "/" << s.kb << " KB used, " -- 2.39.5