]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: piggyback lec in OSDBeacon message
authorKefu Chai <kchai@redhat.com>
Thu, 13 Apr 2017 11:08:01 +0000 (19:08 +0800)
committerKefu Chai <kchai@redhat.com>
Wed, 19 Apr 2017 07:05:12 +0000 (15:05 +0800)
Signed-off-by: Kefu Chai <kchai@redhat.com>
src/osd/OSD.cc
src/osd/OSD.h

index c8031826f4e6f44eea8c62df3f5fababd73e7506..97e0587f43b382fa5dc34c4a0724f0b29c83d107 100644 (file)
@@ -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;
   }
index f6afebd4df08bcb97f751105bc80e7128a7b0bb7..85cff3b09acb60926b3236433d41b6858ba759fd 100644 (file)
@@ -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<pg_t> min_last_epoch_clean_pgs;
   void send_beacon(const ceph::coarse_mono_clock::time_point& now);
 
   void pg_stat_queue_enqueue(PG *pg) {