]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: avoid updating pg_map when osd_stat is unchanged
authorSage Weil <sage@newdream.net>
Fri, 7 Nov 2008 21:07:28 +0000 (13:07 -0800)
committerSage Weil <sage@newdream.net>
Fri, 7 Nov 2008 21:07:28 +0000 (13:07 -0800)
src/mon/PGMonitor.cc
src/mon/PGMonitor.h
src/osd/osd_types.h

index 0bd09ab4b198074e5f5f46eb9914131f86703929..57fde32acc3b2692ce4d6807837712465b96e9c3 100644 (file)
@@ -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<pg_t,pg_stat_t>::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<pg_t,pg_stat_t>::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<pg_t,pg_stat_t>::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<pg_t,pg_stat_t>::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;
index 4878595150734d9e0ebf385e93987ac39ec4806a..d8b0005f4d3abebf242d3e7fc6c8be007a82c10e 100644 (file)
@@ -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);
 
index f09bf05e61f288cd0f93df63d2d15b3cdd14b200..e51ea859e8fbe636a682700dbfc743150bfaaf4d 100644 (file)
@@ -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, "