Also, explicitely dirty info and biginfo where necessary.
Signed-off-by: Samuel Just <sam.just@inktank.com>
for (map<PG*,pistate>::iterator i = pis.begin(); i != pis.end(); ++i) {
PG *pg = i->first;
pg->dirty_big_info = true;
- pg->write_info(t);
+ pg->dirty_info = true;
+ pg->write_if_dirty(t);
// don't let the transaction get too big
if (++num >= g_conf->osd_target_transaction_size) {
// primary is instructing us to trim
ObjectStore::Transaction *t = new ObjectStore::Transaction;
pg->trim(*t, m->trim_to);
- pg->write_info(*t);
+ pg->dirty_info = true;
+ pg->write_if_dirty(*t);
int tr = store->queue_transaction(pg->osr.get(), t,
new ObjectStore::C_DeleteTransaction(t));
assert(tr == 0);
if (dirty_info) {
ObjectStore::Transaction *t = new ObjectStore::Transaction;
- write_info(*t);
+ dirty_info = true;
+ write_if_dirty(*t);
int tr = osd->store->queue_transaction(osr.get(), t);
assert(tr == 0);
}
reg_next_scrub();
- write_info(*t);
- write_log(*t);
+ dirty_info = true;
+ dirty_big_info = true;
+ dirty_log = true;
+ write_if_dirty(*t);
}
void PG::write_info(ObjectStore::Transaction& t)
void PG::write_if_dirty(ObjectStore::Transaction& t)
{
- if (dirty_info)
+ if (dirty_big_info || dirty_info)
write_info(t);
if (dirty_log)
write_log(t);
trim(t, trim_to);
// update the local pg, pg log
- write_info(t);
+ dirty_info = true;
+ write_if_dirty(t);
}
bool PG::check_log_for_corruption(ObjectStore *store)
t.create_collection(cr_log_coll);
t.collection_move(cr_log_coll, coll_t::META_COLL, log_oid);
t.touch(coll_t::META_COLL, log_oid);
- write_info(t);
+ dirty_info = true;
+ write_if_dirty(t);
store->apply_transaction(t);
info.last_backfill = hobject_t();
coll_t c(info.pgid, s);
if (!snap_collections.contains(s)) {
snap_collections.insert(s);
- write_info(t);
- dout(10) << "create_snap_collection " << c << ", set now " << snap_collections << dendl;
+ dirty_big_info = true;
+ write_if_dirty(t);
+ dout(10) << "create_snap_collection " << c << ", set now "
+ << snap_collections << dendl;
t.create_collection(c);
}
return c;
{
ObjectStore::Transaction *t = new ObjectStore::Transaction;
- write_info(*t);
+ dirty_info = true;
+ write_if_dirty(*t);
int tr = osd->store->queue_transaction(osr.get(), t);
assert(tr == 0);
}
// pg on-disk state
void do_pending_flush();
+private:
void write_info(ObjectStore::Transaction& t);
void write_log(ObjectStore::Transaction& t);
+public:
void write_if_dirty(ObjectStore::Transaction& t);
info.stats.stats = m->stats;
ObjectStore::Transaction *t = new ObjectStore::Transaction;
- write_info(*t);
+ dirty_info = true;
+ write_if_dirty(*t);
int tr = osd->store->queue_transaction(osr.get(), t);
assert(tr == 0);
}
recover_got(recovery_info.soid, recovery_info.version);
// update pg
- write_info(*t);
+ dirty_info = true;
+ write_if_dirty(*t);
}
ObjectRecoveryInfo ReplicatedPG::recalc_subsets(const ObjectRecoveryInfo& recovery_info)
if (missing.num_missing() == 0) {
// advance last_complete since nothing else is missing!
info.last_complete = info.last_update;
- write_info(*t);
+ dirty_info = true;
+ write_if_dirty(*t);
}
osd->store->queue_transaction(osr.get(), t, c, NULL, new C_OSD_OndiskWriteUnlockList(&c->obcs));
ObjectStore::Transaction *t = new ObjectStore::Transaction;
pg->snap_collections.erase(snap_to_trim);
t->remove_collection(col_to_trim);
- pg->write_info(*t);
+ pg->dirty_big_info = true;
+ pg->write_if_dirty(*t);
int r = pg->osd->store->queue_transaction(
NULL, t, new ObjectStore::C_DeleteTransaction(t));
assert(r == 0);
}
t->remove_collection(col_to_trim);
pg->snap_collections.erase(snap_to_trim);
- pg->write_info(*t);
+ pg->dirty_big_info = true;
+ pg->write_if_dirty(*t);
int r = pg->osd->store->queue_transaction(NULL, t, new ObjectStore::C_DeleteTransaction(t));
assert(r == 0);
return discard_event();
ObjectStore::Transaction *t = new ObjectStore::Transaction;
dout(10) << "removing snap " << sn << " collection " << c << dendl;
pg->snap_collections.erase(sn);
- pg->write_info(*t);
+ pg->dirty_big_info = true;
+ pg->write_if_dirty(*t);
t->remove_collection(c);
int tr = pg->osd->store->queue_transaction(pg->osr.get(), t);
assert(tr == 0);