void pg_info_t::encode(bufferlist &bl) const
{
- ENCODE_START(27, 26, bl);
+ ENCODE_START(28, 26, bl);
::encode(pgid, bl);
::encode(last_update, bl);
::encode(last_complete, bl);
history.encode(bl);
::encode(purged_snaps, bl);
::encode(last_epoch_started, bl);
+ ::encode(last_user_version, bl);
ENCODE_FINISH(bl);
}
void pg_info_t::decode(bufferlist::iterator &bl)
{
- DECODE_START_LEGACY_COMPAT_LEN(27, 26, 26, bl);
+ DECODE_START_LEGACY_COMPAT_LEN(28, 26, 26, bl);
if (struct_v < 23) {
old_pg_t opgid;
::decode(opgid, bl);
} else {
::decode(last_epoch_started, bl);
}
+ if (struct_v >= 28)
+ ::decode(last_user_version, bl);
+ else
+ last_user_version = last_update.version;
DECODE_FINISH(bl);
}
f->dump_stream("last_update") << last_update;
f->dump_stream("last_complete") << last_complete;
f->dump_stream("log_tail") << log_tail;
+ f->dump_int("last_user_version", last_user_version);
f->dump_stream("last_backfill") << last_backfill;
f->dump_stream("purged_snaps") << purged_snaps;
f->open_object_section("history");
o.back()->pgid = pg_t(1, 2, -1);
o.back()->last_update = eversion_t(3, 4);
o.back()->last_complete = eversion_t(5, 6);
+ o.back()->last_user_version = 2;
o.back()->log_tail = eversion_t(7, 8);
o.back()->last_backfill = hobject_t(object_t("objname"), "key", 123, 456, -1, "");
list<pg_stat_t*> s;
void pg_log_entry_t::encode(bufferlist &bl) const
{
- ENCODE_START(7, 4, bl);
+ ENCODE_START(8, 4, bl);
::encode(op, bl);
::encode(soid, bl);
::encode(version, bl);
if (op == LOST_REVERT)
::encode(prior_version, bl);
::encode(snaps, bl);
+ ::encode(user_version, bl);
ENCODE_FINISH(bl);
}
void pg_log_entry_t::decode(bufferlist::iterator &bl)
{
- DECODE_START_LEGACY_COMPAT_LEN(7, 4, 4, bl);
+ DECODE_START_LEGACY_COMPAT_LEN(8, 4, 4, bl);
::decode(op, bl);
if (struct_v < 2) {
sobject_t old_soid;
::decode(snaps, bl);
}
+ if (struct_v >= 8)
+ ::decode(user_version, bl);
+ else
+ user_version = version.version;
+
DECODE_FINISH(bl);
}
eversion_t last_complete; // last version pg was complete through.
epoch_t last_epoch_started;// last epoch at which this pg started on this osd
+ version_t last_user_version; // last user object version applied to store
+
eversion_t log_tail; // oldest log entry.
hobject_t last_backfill; // objects >= this and < last_complete may be missing
pg_history_t history;
pg_info_t()
- : last_epoch_started(0), last_backfill(hobject_t::get_max())
+ : last_epoch_started(0), last_user_version(0),
+ last_backfill(hobject_t::get_max())
{ }
pg_info_t(pg_t p)
: pgid(p),
- last_epoch_started(0), last_backfill(hobject_t::get_max())
+ last_epoch_started(0), last_user_version(0),
+ last_backfill(hobject_t::get_max())
{ }
bool is_empty() const { return last_update.version == 0; }
__s32 op;
hobject_t soid;
eversion_t version, prior_version, reverting_to;
+ version_t user_version; // the user version for this entry
osd_reqid_t reqid; // caller+tid to uniquely identify request
utime_t mtime; // this is the _user_ mtime, mind you
bufferlist snaps; // only for clone entries
uint64_t offset; // [soft state] my offset on disk
pg_log_entry_t()
- : op(0), invalid_hash(false), invalid_pool(false), offset(0) {}
+ : op(0), user_version(0),
+ invalid_hash(false), invalid_pool(false), offset(0) {}
pg_log_entry_t(int _op, const hobject_t& _soid,
const eversion_t& v, const eversion_t& pv,
const osd_reqid_t& rid, const utime_t& mt)
: op(_op), soid(_soid), version(v),
- prior_version(pv),
+ prior_version(pv), user_version(0),
reqid(rid), mtime(mt), invalid_hash(false), invalid_pool(false),
offset(0) {}