From 7844d0e5ba51a58df2210587001c387fdbf3f6ae Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 21 Nov 2008 10:41:50 -0800 Subject: [PATCH] mon: send osdmap updates if pg_stats indicates an old map for a long time --- src/messages/MPGStats.h | 9 ++++++++- src/mon/PGMonitor.cc | 9 +++++++++ src/osd/OSD.cc | 5 ++++- src/osd/OSD.h | 1 + 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/messages/MPGStats.h b/src/messages/MPGStats.h index 4cabe6b803fa6..0dec47e97d335 100644 --- a/src/messages/MPGStats.h +++ b/src/messages/MPGStats.h @@ -22,9 +22,12 @@ public: ceph_fsid fsid; map pg_stat; osd_stat_t osd_stat; + epoch_t epoch; + utime_t had_map_for; MPGStats() : Message(MSG_PGSTATS) {} - MPGStats(ceph_fsid& f) : Message(MSG_PGSTATS), fsid(f) {} + MPGStats(ceph_fsid& f, epoch_t e, utime_t had) : + Message(MSG_PGSTATS), fsid(f), epoch(e), had_map_for(had) {} const char *get_type_name() { return "pg_stats"; } void print(ostream& out) { @@ -35,12 +38,16 @@ public: ::encode(fsid, payload); ::encode(osd_stat, payload); ::encode(pg_stat, payload); + ::encode(epoch, payload); + ::encode(had_map_for, payload); } void decode_payload() { bufferlist::iterator p = payload.begin(); ::decode(fsid, p); ::decode(osd_stat, p); ::decode(pg_stat, p); + ::decode(epoch, p); + ::decode(had_map_for, p); } }; diff --git a/src/mon/PGMonitor.cc b/src/mon/PGMonitor.cc index 182fbbec95a62..7a6b3aec6151e 100644 --- a/src/mon/PGMonitor.cc +++ b/src/mon/PGMonitor.cc @@ -252,9 +252,18 @@ void PGMonitor::handle_statfs(MStatfs *statfs) bool PGMonitor::preprocess_pg_stats(MPGStats *stats) { int from = stats->get_orig_source().num(); + + // first, just see if they need a new osdmap. but + // only if they've had the map for a while. + if (stats->had_map_for > 10.0 && + stats->epoch < mon->osdmon->osdmap.get_epoch()) + mon->osdmon->send_latest(stats->get_source_inst(), stats->epoch+1); + + // any new osd or pg info? 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++) { diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index e1b5f0d54c68b..6fe7e55ae5934 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -1192,7 +1192,9 @@ void OSD::send_pg_stats() if (!pg_stat_pending.empty() || osd_stat_pending) { dout(1) << "send_pg_stats - " << pg_stat_pending.size() << " pgs updated" << dendl; - MPGStats *m = new MPGStats(osdmap->get_fsid()); + utime_t had_for = g_clock.now(); + had_for -= had_map_since; + MPGStats *m = new MPGStats(osdmap->get_fsid(), osdmap->get_epoch(), had_for); for (map::iterator p = pg_stat_pending.begin(); p != pg_stat_pending.end(); p++) { @@ -1684,6 +1686,7 @@ void OSD::handle_osd_map(MOSDMap *m) superblock.current_epoch = cur; advance_map(t, inc.removed_snaps); advanced = true; + had_map_since = g_clock.now(); } // all the way? diff --git a/src/osd/OSD.h b/src/osd/OSD.h index bbfa0f4de3af9..522d10763a39c 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -251,6 +251,7 @@ private: // -- osd map -- OSDMap *osdmap; + utime_t had_map_since; RWLock map_lock; list waiting_for_osdmap; -- 2.39.5