void PGMapDigest::encode(bufferlist& bl, uint64_t features) const
{
// NOTE: see PGMap::encode_digest
- ENCODE_START(1, 1, bl);
+ ENCODE_START(2, 1, bl);
::encode(num_pg, bl);
::encode(num_pg_active, bl);
::encode(num_osd, bl);
::encode(pg_sum, bl, features);
::encode(num_pg_by_state, bl);
::encode(num_pg_by_osd, bl);
+ ::encode(osd_last_seq, bl);
ENCODE_FINISH(bl);
}
void PGMapDigest::decode(bufferlist::iterator& p)
{
- DECODE_START(1, p);
+ DECODE_START(2, p);
::decode(num_pg, p);
::decode(num_pg_active, p);
::decode(num_osd, p);
::decode(pg_sum, p);
::decode(num_pg_by_state, p);
::decode(num_pg_by_osd, p);
+ if (struct_v >= 2) {
+ ::decode(osd_last_seq, p);
+ } else {
+ int s = 0;
+ for (auto& p : osd_stat) {
+ if (p.first >= s) {
+ s = p.first + 1;
+ }
+ }
+ osd_last_seq.resize(s);
+ }
DECODE_FINISH(p);
}
for (auto& p : osd_stat) {
f->open_object_section("osd_stat");
f->dump_int("osd", p.first);
+ f->dump_unsigned("seq", osd_last_seq[p.first]);
p.second.dump(f);
f->close_section();
}
if (t == osd_stat.end()) {
osd_stat.insert(make_pair(osd, new_stats));
} else {
- stat_osd_sub(t->second);
+ stat_osd_sub(t->first, t->second);
t->second = new_stats;
}
auto i = osd_epochs.find(osd);
else
i->second = j->second;
- stat_osd_add(new_stats);
+ stat_osd_add(osd, new_stats);
// adjust [near]full status
register_nearfull_status(osd, new_stats);
++p) {
auto t = osd_stat.find(*p);
if (t != osd_stat.end()) {
- stat_osd_sub(t->second);
+ stat_osd_sub(t->first, t->second);
osd_stat.erase(t);
}
for (auto p = osd_stat.begin();
p != osd_stat.end();
++p)
- stat_osd_add(p->second);
+ stat_osd_add(p->first, p->second);
redo_full_sets();
auto i = osd_epochs.find(osd);
if (i != osd_epochs.end())
old_lec = i->second;
- stat_osd_sub(o->second);
+ stat_osd_sub(osd, o->second);
}
osd_stat_t& r = osd_stat[osd];
::decode(r, p);
- stat_osd_add(r);
+ stat_osd_add(osd, r);
// adjust [near]full status
register_nearfull_status(osd, r);
{
auto o = osd_stat.find(osd);
if (o != osd_stat.end()) {
- stat_osd_sub(o->second);
+ stat_osd_sub(osd, o->second);
osd_stat.erase(o);
// remove these old osds from full/nearfull set(s), too
stat_pg_add(pgid, n, sameosds);
}
-void PGMap::stat_osd_add(const osd_stat_t &s)
+void PGMap::stat_osd_add(int osd, const osd_stat_t &s)
{
num_osd++;
osd_sum.add(s);
+ if (osd >= (int)osd_last_seq.size()) {
+ osd_last_seq.resize(osd + 1);
+ }
+ osd_last_seq[osd] = s.seq;
}
-void PGMap::stat_osd_sub(const osd_stat_t &s)
+void PGMap::stat_osd_sub(int osd, const osd_stat_t &s)
{
num_osd--;
osd_sum.sub(s);
+ assert(osd < (int)osd_last_seq.size());
+ osd_last_seq[osd] = 0;
}
epoch_t PGMap::calc_min_last_epoch_clean() const
MEMPOOL_CLASS_HELPERS();
virtual ~PGMapDigest() {}
+ mempool::pgmap::vector<uint64_t> osd_last_seq;
mempool::pgmap::unordered_map<int32_t,osd_stat_t> osd_stat;
// aggregate state, populated by PGMap child
return .95;
}
+ uint64_t get_last_osd_stat_seq(int osd) {
+ if (osd < (int)osd_last_seq.size())
+ return osd_last_seq[osd];
+ return 0;
+ }
+
void encode(bufferlist& bl, uint64_t features) const;
void decode(bufferlist::iterator& p);
void dump(Formatter *f) const;
void stat_pg_sub(const pg_t &pgid, const pg_stat_t &s,
bool sameosds=false);
void stat_pg_update(const pg_t pgid, pg_stat_t &prev, bufferlist::iterator& blp);
- void stat_osd_add(const osd_stat_t &s);
- void stat_osd_sub(const osd_stat_t &s);
+ void stat_osd_add(int osd, const osd_stat_t &s);
+ void stat_osd_sub(int osd, const osd_stat_t &s);
void encode(bufferlist &bl, uint64_t features=-1) const;
void decode(bufferlist::iterator &bl);