last_osdmap_epoch = inc.osdmap_epoch;
if (inc.pg_scan)
last_pg_scan = inc.pg_scan;
-
- min_last_epoch_clean = 0; // invalidate
}
void PGMap::calc_stats()
p != osd_stat.end();
++p)
stat_osd_add(p->first, p->second);
-
- min_last_epoch_clean = calc_min_last_epoch_clean();
}
void PGMap::update_pg(pg_t pgid, bufferlist& bl)
{
bufferlist::iterator p = bl.begin();
auto s = pg_stat.find(pgid);
- epoch_t old_lec = 0, lec;
if (s != pg_stat.end()) {
- old_lec = s->second.get_effective_last_epoch_clean();
stat_pg_update(pgid, s->second, p);
- lec = s->second.get_effective_last_epoch_clean();
} else {
pg_stat_t& r = pg_stat[pgid];
::decode(r, p);
stat_pg_add(pgid, r);
- lec = r.get_effective_last_epoch_clean();
}
-
- if (min_last_epoch_clean &&
- (lec < min_last_epoch_clean || // we did
- (lec > min_last_epoch_clean && // we might
- old_lec == min_last_epoch_clean)
- ))
- min_last_epoch_clean = 0;
}
void PGMap::remove_pg(pg_t pgid)
{
auto s = pg_stat.find(pgid);
if (s != pg_stat.end()) {
- if (min_last_epoch_clean &&
- s->second.get_effective_last_epoch_clean() == min_last_epoch_clean)
- min_last_epoch_clean = 0;
stat_pg_sub(pgid, s->second);
pg_stat.erase(s);
}
stat_osd_add(osd, r);
// epoch?
- if (!p.end()) {
- epoch_t e;
- ::decode(e, p);
-
- if (e < min_last_epoch_clean ||
- (e > min_last_epoch_clean &&
- old_lec == min_last_epoch_clean))
- min_last_epoch_clean = 0;
- } else {
- // WARNING: we are not refreshing min_last_epoch_clean! must be old store
- // or old mon running.
- }
+ epoch_t e;
+ ::decode(e, p);
}
void PGMap::remove_osd(int osd)
osd_last_seq[osd] = 0;
}
-epoch_t PGMap::calc_min_last_epoch_clean() const
-{
- if (pg_stat.empty())
- return 0;
-
- auto p = pg_stat.begin();
- epoch_t min = p->second.get_effective_last_epoch_clean();
- for (++p; p != pg_stat.end(); ++p) {
- epoch_t lec = p->second.get_effective_last_epoch_clean();
- if (lec < min)
- min = lec;
- }
- // also scan osd epochs
- // don't trim past the oldest reported osd epoch
- for (auto i = osd_epochs.begin();
- i != osd_epochs.end();
- ++i) {
- if (i->second < min)
- min = i->second;
- }
- return min;
-}
-
void PGMap::encode_digest(const OSDMap& osdmap,
bufferlist& bl, uint64_t features) const
{
f->dump_stream("stamp") << stamp;
f->dump_unsigned("last_osdmap_epoch", last_osdmap_epoch);
f->dump_unsigned("last_pg_scan", last_pg_scan);
- f->dump_unsigned("min_last_epoch_clean", min_last_epoch_clean);
f->open_object_section("pg_stats_sum");
pg_sum.dump(f);
// aggregate stats (soft state), generated by calc_stats()
- mutable epoch_t min_last_epoch_clean = 0;
mempool::pgmap::unordered_map<int,set<pg_t> > pg_by_osd;
mempool::pgmap::unordered_map<int,int> blocked_by_sum;
mempool::pgmap::list< pair<pool_stat_t, utime_t> > pg_sum_deltas;
const uint64_t pool,
const pool_stat_t& old_pool_sum);
- epoch_t calc_min_last_epoch_clean() const;
-
public:
mempool::pgmap::set<pg_t> creating_pgs;
void get_filtered_pg_stats(uint32_t state, int64_t poolid, int64_t osdid,
bool primary, set<pg_t>& pgs) 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;
- }
-
void get_health_checks(
CephContext *cct,
const OSDMap& osdmap,
#include "include/stringify.h"
-TEST(pgmap, min_last_epoch_clean)
-{
- PGMap pg_map;
- PGMap::Incremental inc;
- osd_stat_t os;
- pg_stat_t ps;
-
- ps.last_epoch_clean = 999;
- inc.pg_stat_updates[pg_t(9,9)] = ps;
- inc.version = 1;
- inc.update_stat(0, 123, os);
- pg_map.apply_incremental(g_ceph_context, inc);
- 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.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.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.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.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.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.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.get_min_last_epoch_clean());
-
-}
-
-TEST(pgmap, calc_stats)
-{
- bufferlist bl;
- {
- PGMap pg_map;
- PGMap::Incremental inc;
- osd_stat_t os;
- pg_stat_t ps;
-
- ps.last_epoch_clean = 999;
- inc.pg_stat_updates[pg_t(9,9)] = ps;
- inc.version = 1;
- inc.update_stat(0, 123, os);
- pg_map.apply_incremental(g_ceph_context, inc);
- ASSERT_EQ(123u, pg_map.get_min_last_epoch_clean());
- pg_map.encode(bl);
- }
- {
- PGMap pg_map;
- PGMap::Incremental inc;
- osd_stat_t os;
- pg_stat_t ps;
-
- ps.last_epoch_clean = 999;
- inc.pg_stat_updates[pg_t(9,9)] = ps;
- inc.version = 1;
- inc.update_stat(0, 321, os);
- pg_map.apply_incremental(g_ceph_context, inc);
- ASSERT_EQ(321u, pg_map.get_min_last_epoch_clean());
- bufferlist::iterator p = bl.begin();
- ::decode(pg_map, p);
- ASSERT_EQ(123u, pg_map.get_min_last_epoch_clean());
- }
-}
namespace {
class CheckTextTable : public TextTable {