return std::forward<Callback>(cb)(pg_map, std::forward<Args>(args)...);
}
+ template<typename Callback, typename...Args>
+ auto with_mutable_pgmap(Callback&& cb, Args&&...args) ->
+ decltype(cb(pg_map, std::forward<Args>(args)...))
+ {
+ Mutex::Locker l(lock);
+ return std::forward<Callback>(cb)(pg_map, std::forward<Args>(args)...);
+ }
+
template<typename... Args>
void with_monmap(Args &&... args) const
{
void PGMapDigest::encode(bufferlist& bl, uint64_t features) const
{
// NOTE: see PGMap::encode_digest
- uint8_t v = 2;
+ uint8_t v = 3;
if (!HAVE_FEATURE(features, SERVER_MIMIC)) {
v = 1;
}
::encode(pg_sum_delta, bl, features);
::encode(stamp_delta, bl);
::encode(avail_space_by_rule, bl);
+ if (struct_v >= 3) {
+ ::encode(purged_snaps, bl);
+ }
ENCODE_FINISH(bl);
}
void PGMapDigest::decode(bufferlist::iterator& p)
{
- DECODE_START(2, p);
+ DECODE_START(3, p);
::decode(num_pg, p);
::decode(num_pg_active, p);
::decode(num_pg_unknown, p);
::decode(pg_sum_delta, p);
::decode(stamp_delta, p);
::decode(avail_space_by_rule, p);
+ if (struct_v >= 3) {
+ ::decode(purged_snaps, p);
+ }
DECODE_FINISH(p);
}
f->close_section();
}
f->close_section();
+ f->open_array_section("purged_snaps");
+ for (auto& j : purged_snaps) {
+ f->open_object_section("pool");
+ f->dump_int("pool", j.first);
+ f->open_object_section("purged_snaps");
+ for (auto i = j.second.begin(); i != j.second.end(); ++i) {
+ f->open_object_section("interval");
+ f->dump_stream("start") << i.get_start();
+ f->dump_stream("length") << i.get_len();
+ f->close_section();
+ }
+ f->close_section();
+ f->close_section();
+ }
+ f->close_section();
}
void PGMapDigest::generate_test_instances(list<PGMapDigest*>& ls)
}
}
+void PGMap::calc_purged_snaps()
+{
+ purged_snaps.clear();
+ set<int64_t> unknown;
+ for (auto& i : pg_stat) {
+ if (i.second.state == 0) {
+ unknown.insert(i.first.pool());
+ purged_snaps.erase(i.first.pool());
+ continue;
+ } else if (unknown.count(i.first.pool())) {
+ continue;
+ }
+ auto j = purged_snaps.find(i.first.pool());
+ if (j == purged_snaps.end()) {
+ // base case
+ purged_snaps[i.first.pool()] = i.second.purged_snaps;
+ } else {
+ j->second.intersection_of(i.second.purged_snaps);
+ }
+ }
+}
+
void PGMap::stat_osd_add(int osd, const osd_stat_t &s)
{
num_osd++;
}
void PGMap::encode_digest(const OSDMap& osdmap,
- bufferlist& bl, uint64_t features) const
+ bufferlist& bl, uint64_t features)
{
get_rules_avail(osdmap, &avail_space_by_rule);
+ calc_purged_snaps();
PGMapDigest::encode(bl, features);
}
};
mempool::pgmap::unordered_map<int32_t,pg_count> num_pg_by_osd;
+ mempool::pgmap::map<int64_t,interval_set<snapid_t>> purged_snaps;
+
// recent deltas, and summation
/**
* keep track of last deltas for each pool, calculated using
bool sameosds=false);
void stat_pg_sub(const pg_t &pgid, const pg_stat_t &s,
bool sameosds=false);
+ void calc_purged_snaps();
void stat_osd_add(int osd, const osd_stat_t &s);
void stat_osd_sub(int osd, const osd_stat_t &s);
/// encode subset of our data to a PGMapDigest
void encode_digest(const OSDMap& osdmap,
- bufferlist& bl, uint64_t features) const;
+ bufferlist& bl, uint64_t features);
int64_t get_rule_avail(const OSDMap& osdmap, int ruleno) const;
void get_rules_avail(const OSDMap& osdmap,