ceph::os::Transaction &t)
{
std::map<string,bufferlist> km;
+ std::string key_to_remove;
if (dirty_big_info || dirty_info) {
int ret = prepare_info_keymap(
shard_services.get_cct(),
&km,
+ &key_to_remove,
get_osdmap_epoch(),
info,
last_written_info,
if (!km.empty()) {
t.omap_setkeys(coll, pgmeta_oid, km);
}
+ if (!key_to_remove.empty()) {
+ t.omap_rmkey(coll, pgmeta_oid, key_to_remove);
+ }
}
void PG::log_state_enter(const char *state) {
info.stats.stats.add(unstable_stats);
unstable_stats.clear();
map<string,bufferlist> km;
+ string key_to_remove;
if (dirty_big_info || dirty_info) {
int ret = prepare_info_keymap(
cct,
&km,
+ &key_to_remove,
get_osdmap_epoch(),
info,
last_written_info,
t, &km, coll, pgmeta_oid, pool.info.require_rollback());
if (!km.empty())
t.omap_setkeys(coll, pgmeta_oid, km);
+ if (!key_to_remove.empty())
+ t.omap_rmkey(coll, pgmeta_oid, key_to_remove);
}
#pragma GCC diagnostic ignored "-Wpragmas"
int prepare_info_keymap(
CephContext* cct,
map<string,bufferlist> *km,
+ string *key_to_remove,
epoch_t epoch,
pg_info_t &info,
pg_info_t &last_written_info,
}
*_dout << dendl;
}
+ } else if (info.last_update <= last_written_info.last_update) {
+ // clean up any potentially stale fastinfo key resulting from last_update
+ // not moving forwards (e.g., a backwards jump during peering)
+ *key_to_remove = fastinfo_key;
}
last_written_info = info;
int prepare_info_keymap(
CephContext* cct,
map<string,bufferlist> *km,
+ string *key_to_remove,
epoch_t epoch,
pg_info_t &info,
pg_info_t &last_written_info,
coll_t coll(info.pgid);
ghobject_t pgmeta_oid(info.pgid.make_pgmeta_oid());
map<string,bufferlist> km;
+ string key_to_remove;
pg_info_t last_written_info;
int ret = prepare_info_keymap(
g_ceph_context,
- &km, epoch,
+ &km, &key_to_remove,
+ epoch,
info,
last_written_info,
past_intervals,
true, true, false);
if (ret) cerr << "Failed to write info" << std::endl;
t.omap_setkeys(coll, pgmeta_oid, km);
+ if (!key_to_remove.empty()) {
+ t.omap_rmkey(coll, pgmeta_oid, key_to_remove);
+ }
return ret;
}