void pg_info_t::encode(ceph::buffer::list &bl) const
{
- ENCODE_START(32, 26, bl);
+ ENCODE_START(33, 26, bl);
encode(pgid.pgid, bl);
encode(last_update, bl);
encode(last_complete, bl);
encode(last_backfill, bl);
encode(true, bl); // was last_backfill_bitwise
encode(last_interval_started, bl);
+ encode(partial_writes_last_complete, bl);
ENCODE_FINISH(bl);
}
void pg_info_t::decode(ceph::buffer::list::const_iterator &bl)
{
- DECODE_START(32, bl);
+ DECODE_START(33, bl);
decode(pgid.pgid, bl);
decode(last_update, bl);
decode(last_complete, bl);
} else {
last_interval_started = last_epoch_started;
}
+ if (struct_v >= 33) {
+ decode(partial_writes_last_complete, bl);
+ }
DECODE_FINISH(bl);
}
f->dump_stream("log_tail") << log_tail;
f->dump_int("last_user_version", last_user_version);
f->dump_stream("last_backfill") << last_backfill;
+ f->open_array_section("partial_writes_last_complete");
+ for (const auto & [shard, versionrange] : partial_writes_last_complete) {
+ auto & [from, to] = versionrange;
+ f->open_object_section("shard");
+ f->dump_int("id", int(shard));
+ f->dump_stream("from") << from;
+ f->dump_stream("to") << to;
+ f->close_section();
+ }
+ f->close_section();
f->open_array_section("purged_snaps");
for (interval_set<snapid_t>::const_iterator i=purged_snaps.begin();
i != purged_snaps.end();
interval_set<snapid_t> purged_snaps;
+ std::map<shard_id_t,std::pair<eversion_t, eversion_t>>
+ partial_writes_last_complete; ///< last_complete for shards not modified by a partial write
+
pg_stat_t stats;
pg_history_t history;
l.log_tail == r.log_tail &&
l.last_backfill == r.last_backfill &&
l.purged_snaps == r.purged_snaps &&
+ l.partial_writes_last_complete == r.partial_writes_last_complete &&
l.stats == r.stats &&
l.history == r.history &&
l.hit_set == r.hit_set;
eversion_t last_update;
eversion_t last_complete;
version_t last_user_version;
+ std::map<shard_id_t,std::pair<eversion_t,eversion_t>> partial_writes_last_complete;
struct { // pg_stat_t stats
eversion_t version;
version_t reported_seq;
last_update = info.last_update;
last_complete = info.last_complete;
last_user_version = info.last_user_version;
+ partial_writes_last_complete = info.partial_writes_last_complete;
stats.version = info.stats.version;
stats.reported_seq = info.stats.reported_seq;
stats.last_fresh = info.stats.last_fresh;
info->last_update = last_update;
info->last_complete = last_complete;
info->last_user_version = last_user_version;
+ info->partial_writes_last_complete = partial_writes_last_complete;
info->stats.version = stats.version;
info->stats.reported_seq = stats.reported_seq;
info->stats.last_fresh = stats.last_fresh;
}
void encode(ceph::buffer::list& bl) const {
- ENCODE_START(1, 1, bl);
+ ENCODE_START(2, 1, bl);
encode(last_update, bl);
encode(last_complete, bl);
encode(last_user_version, bl);
encode(stats.stats.sum.num_wr, bl);
encode(stats.stats.sum.num_wr_kb, bl);
encode(stats.stats.sum.num_objects_dirty, bl);
+ encode(partial_writes_last_complete, bl);
ENCODE_FINISH(bl);
}
void decode(ceph::buffer::list::const_iterator& p) {
- DECODE_START(1, p);
+ DECODE_START(2, p);
decode(last_update, p);
decode(last_complete, p);
decode(last_user_version, p);
decode(stats.stats.sum.num_wr, p);
decode(stats.stats.sum.num_wr_kb, p);
decode(stats.stats.sum.num_objects_dirty, p);
+ if (struct_v >= 2)
+ decode(partial_writes_last_complete, p);
DECODE_FINISH(p);
}
void dump(ceph::Formatter *f) const {
f->dump_stream("last_update") << last_update;
f->dump_stream("last_complete") << last_complete;
f->dump_stream("last_user_version") << last_user_version;
+ f->open_array_section("partial_writes_last_complete");
+ for (const auto & [shard, versionrange] : partial_writes_last_complete) {
+ auto & [from, to] = versionrange;
+ f->open_object_section("shard");
+ f->dump_int("id", int(shard));
+ f->dump_stream("from") << from;
+ f->dump_stream("to") << to;
+ f->close_section();
+ }
+ f->close_section();
f->open_object_section("stats");
f->dump_stream("version") << stats.version;
f->dump_unsigned("reported_seq", stats.reported_seq);