From f6768064f6fdfaf60ac8ce494c0fc552bbd0e5c6 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Thu, 13 Apr 2017 19:08:01 +0800 Subject: [PATCH] osd: piggyback lec in OSDBeacon message Signed-off-by: Kefu Chai --- src/osd/OSD.cc | 14 +++++++++++++- src/osd/OSD.h | 4 ++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index c8031826f4e6..97e0587f43b3 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -2388,6 +2388,9 @@ int OSD::init() MPGStats *m = new MPGStats(monc->get_fsid(), osdmap->get_epoch(), had_for); m->osd_stat = cur_stat; + Mutex::Locker lec{min_last_epoch_clean_lock}; + min_last_epoch_clean = osdmap->get_epoch(); + min_last_epoch_clean_pgs.clear(); RWLock::RLocker lpg(pg_map_lock); for (const auto &i : pg_map) { PG *pg = i.second; @@ -2398,6 +2401,9 @@ int OSD::init() pg->pg_stats_publish_lock.Lock(); if (pg->pg_stats_publish_valid) { m->pg_stat[pg->info.pgid.pgid] = pg->pg_stats_publish; + const auto lec = pg->pg_stats_publish.get_effective_last_epoch_clean(); + min_last_epoch_clean = min(min_last_epoch_clean, lec); + min_last_epoch_clean_pgs.push_back(pg->info.pgid.pgid); } pg->pg_stats_publish_lock.Unlock(); } @@ -5680,7 +5686,13 @@ void OSD::send_beacon(const ceph::coarse_mono_clock::time_point& now) ceph::features::mon::FEATURE_LUMINOUS)) { dout(20) << __func__ << " sending" << dendl; last_sent_beacon = now; - monc->send_mon_message(new MOSDBeacon()); + MOSDBeacon* beacon = nullptr; + { + Mutex::Locker l{min_last_epoch_clean_lock}; + beacon = new MOSDBeacon(osdmap->get_epoch(), min_last_epoch_clean); + std::swap(beacon->pgs, min_last_epoch_clean_pgs); + } + monc->send_mon_message(beacon); } else { dout(20) << __func__ << " not sending" << dendl; } diff --git a/src/osd/OSD.h b/src/osd/OSD.h index f6afebd4df08..85cff3b09acb 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -2160,6 +2160,10 @@ protected: void flush_pg_stats(); ceph::coarse_mono_clock::time_point last_sent_beacon; + Mutex min_last_epoch_clean_lock{"OSD::min_last_epoch_clean_lock"}; + epoch_t min_last_epoch_clean = 0; + // which pgs were scanned for min_lec + std::vector min_last_epoch_clean_pgs; void send_beacon(const ceph::coarse_mono_clock::time_point& now); void pg_stat_queue_enqueue(PG *pg) { -- 2.47.3