}
// try to do info efficiently?
- if (!dirty_big_info && try_fast_info) {
+ if (!dirty_big_info && try_fast_info &&
+ info.last_update > last_written_info.last_update) {
pg_fast_info_t fast;
fast.populate_from(info);
- fast.apply_to(&last_written_info);
+ bool did = fast.try_apply_to(&last_written_info);
+ assert(did); // we verified last_update increased above
if (info == last_written_info) {
::encode(fast, (*km)[fastinfo_key]);
return 0;
}
*_dout << dendl;
}
- (*km)[fastinfo_key]; // erase any previous fastinfo
last_written_info = info;
// info. store purged_snaps separately.
if (!p.end()) {
pg_fast_info_t fast;
::decode(fast, p);
- fast.apply_to(&info);
+ fast.try_apply_to(&info);
}
return 0;
}
info_struct_v);
assert(r >= 0);
+ last_written_info = info;
+
ostringstream oss;
pg_log.read_log_and_missing(
store,
stats.stats.sum.num_objects_dirty = info.stats.stats.sum.num_objects_dirty;
}
- void apply_to(pg_info_t* info) {
+ bool try_apply_to(pg_info_t* info) {
+ if (last_update <= info->last_update)
+ return false;
info->last_update = last_update;
info->last_complete = last_complete;
info->last_user_version = last_user_version;
info->stats.stats.sum.num_wr = stats.stats.sum.num_wr;
info->stats.stats.sum.num_wr_kb = stats.stats.sum.num_wr_kb;
info->stats.stats.sum.num_objects_dirty = stats.stats.sum.num_objects_dirty;
+ return true;
}
void encode(bufferlist& bl) const {