]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/PGMap: cache min_last_epoch_clean
authorSage Weil <sage@inktank.com>
Sat, 22 Feb 2014 17:32:08 +0000 (09:32 -0800)
committerSage Weil <sage@inktank.com>
Fri, 14 Mar 2014 20:20:53 +0000 (13:20 -0700)
We call this a lot.  Only recalculate when we decode or when we apply
an incremental.

Adjust unit test accordingly.

Signed-off-by: Sage Weil <sage@inktank.com>
src/mon/OSDMonitor.cc
src/mon/PGMap.cc
src/mon/PGMap.h
src/test/mon/PGMap.cc

index b03144144a6fdd87b7c1ef8209e9ca9ccc862c9f..21348dea2079d38ab05a3e3efa8393cc56e4de9c 100644 (file)
@@ -640,7 +640,7 @@ version_t OSDMonitor::get_trim_to()
 {
   if (mon->pgmon()->is_readable() &&
       mon->pgmon()->pg_map.creating_pgs.empty()) {
-    epoch_t floor = mon->pgmon()->pg_map.calc_min_last_epoch_clean();
+    epoch_t floor = mon->pgmon()->pg_map.get_min_last_epoch_clean();
     dout(10) << " min_last_epoch_clean " << floor << dendl;
     if (g_conf->mon_osd_force_trim_to > 0 &&
        g_conf->mon_osd_force_trim_to < (int)get_last_committed()) {
index fbed206613d51c51922ea021d399b9908bd818c8..72a60d9ac249e6435f5ed78e47fed439862aebd1 100644 (file)
@@ -282,6 +282,8 @@ void PGMap::apply_incremental(CephContext *cct, const Incremental& inc)
     last_osdmap_epoch = inc.osdmap_epoch;
   if (inc.pg_scan)
     last_pg_scan = inc.pg_scan;
+
+  min_last_epoch_clean = 0;  // invalidate
 }
 
 void PGMap::redo_full_sets()
@@ -334,6 +336,8 @@ void PGMap::calc_stats()
     stat_osd_add(p->second);
 
   redo_full_sets();
+
+  calc_min_last_epoch_clean();
 }
 
 void PGMap::update_pg(pg_t pgid, bufferlist& bl)
index f4e8df5f0ffcab3433f655b23fa3060c88ab710d..9edb19a93d6c4b5cdc569944c2e681a61af26ccf 100644 (file)
@@ -105,6 +105,7 @@ public:
   ceph::unordered_map<int,pool_stat_t> pg_pool_sum;
   pool_stat_t pg_sum;
   osd_stat_t osd_sum;
+  mutable epoch_t min_last_epoch_clean;
 
   utime_t stamp;
 
@@ -152,6 +153,9 @@ public:
                              const utime_t ts,
                              const uint64_t pool,
                              const pool_stat_t& old_pool_sum);
+
+  epoch_t calc_min_last_epoch_clean() const;
+
  public:
 
   set<pg_t> creating_pgs;   // lru: front = new additions, back = recently pinged
@@ -169,7 +173,8 @@ public:
       last_osdmap_epoch(0), last_pg_scan(0),
       full_ratio(0), nearfull_ratio(0),
       num_pg(0),
-      num_osd(0)
+      num_osd(0),
+      min_last_epoch_clean(0)
   {}
 
   void set_full_ratios(float full, float nearfull) {
@@ -285,7 +290,11 @@ public:
   void print_summary(Formatter *f, ostream *out) const;
   void print_oneline_summary(ostream *out) const;
 
-  epoch_t calc_min_last_epoch_clean() const;
+  epoch_t get_min_last_epoch_clean() const {
+    if (!min_last_epoch_clean)
+      min_last_epoch_clean = calc_min_last_epoch_clean();
+    return min_last_epoch_clean;
+  }
 
   static void generate_test_instances(list<PGMap*>& o);
 };
index f7fbe7e2043aeba5d40acce6fcba8db41aa9b074..9f7a6b2d0b1fe818542e5af265b3a0e1dfdc0b4c 100644 (file)
@@ -30,54 +30,54 @@ TEST(pgmap, min_last_epoch_clean)
   inc.version = 1;
   inc.update_stat(0, 123, os);
   pg_map.apply_incremental(g_ceph_context, inc);
-  ASSERT_EQ(123u, pg_map.calc_min_last_epoch_clean());
+  ASSERT_EQ(123u, pg_map.get_min_last_epoch_clean());
 
   inc = PGMap::Incremental();
   inc.version = 2;
   inc.update_stat(1, 222, os);
   pg_map.apply_incremental(g_ceph_context, inc);
-  ASSERT_EQ(123u, pg_map.calc_min_last_epoch_clean());
+  ASSERT_EQ(123u, pg_map.get_min_last_epoch_clean());
 
   inc = PGMap::Incremental();
   inc.version = 3;
   inc.update_stat(0, 222, os);
   pg_map.apply_incremental(g_ceph_context, inc);
-  ASSERT_EQ(222u, pg_map.calc_min_last_epoch_clean());
+  ASSERT_EQ(222u, pg_map.get_min_last_epoch_clean());
 
   inc = PGMap::Incremental();
   inc.version = 4;
   inc.update_stat(0, 333, os);
   inc.update_stat(1, 333, os);
   pg_map.apply_incremental(g_ceph_context, inc);
-  ASSERT_EQ(333u, pg_map.calc_min_last_epoch_clean());
+  ASSERT_EQ(333u, pg_map.get_min_last_epoch_clean());
 
   ps.last_epoch_clean = 222;
   inc = PGMap::Incremental();
   inc.version = 5;
   inc.pg_stat_updates[pg_t(1,1)] = ps;
   pg_map.apply_incremental(g_ceph_context, inc);
-  ASSERT_EQ(222u, pg_map.calc_min_last_epoch_clean());
+  ASSERT_EQ(222u, pg_map.get_min_last_epoch_clean());
 
   ps.last_epoch_clean = 223;
   inc = PGMap::Incremental();
   inc.version = 6;
   inc.pg_stat_updates[pg_t(1,1)] = ps;
   pg_map.apply_incremental(g_ceph_context, inc);
-  ASSERT_EQ(223u, pg_map.calc_min_last_epoch_clean());
+  ASSERT_EQ(223u, pg_map.get_min_last_epoch_clean());
 
   ps.last_epoch_clean = 224;
   inc = PGMap::Incremental();
   inc.version = 7;
   inc.pg_stat_updates[pg_t(2,2)] = ps;
   pg_map.apply_incremental(g_ceph_context, inc);
-  ASSERT_EQ(223u, pg_map.calc_min_last_epoch_clean());
+  ASSERT_EQ(223u, pg_map.get_min_last_epoch_clean());
 
   ps.last_epoch_clean = 225;
   inc = PGMap::Incremental();
   inc.version = 8;
   inc.pg_stat_updates[pg_t(1,1)] = ps;
   pg_map.apply_incremental(g_ceph_context, inc);
-  ASSERT_EQ(224u, pg_map.calc_min_last_epoch_clean());
+  ASSERT_EQ(224u, pg_map.get_min_last_epoch_clean());
 
 }