} else {
// primary is instructing us to trim
ObjectStore::Transaction *t = new ObjectStore::Transaction;
- pg->pg_log.trim(*t, m->trim_to, pg->info, pg->log_oid);
+ pg->pg_log.trim(m->trim_to, pg->info);
pg->dirty_info = true;
pg->write_if_dirty(*t);
int tr = store->queue_transaction(pg->osr.get(), t,
dout(10) << "append_log adding " << keys.size() << " keys" << dendl;
t.omap_setkeys(coll_t::META_COLL, log_oid, keys);
- pg_log.trim(t, trim_to, info, log_oid);
+ pg_log.trim(trim_to, info);
// update the local pg, pg log
dirty_info = true;
index();
}
-void PGLog::IndexedLog::trim(ObjectStore::Transaction& t, hobject_t& log_oid, eversion_t s)
+void PGLog::IndexedLog::trim(eversion_t s)
{
if (complete_to != log.end() &&
complete_to->version <= s) {
<< " on " << *this << dendl;
}
- set<string> keys_to_rm;
while (!log.empty()) {
pg_log_entry_t &e = *log.begin();
if (e.version > s)
break;
generic_dout(20) << "trim " << e << dendl;
unindex(e); // remove from index,
- keys_to_rm.insert(e.get_key_name());
log.pop_front(); // from log
}
- t.omap_rmkeys(coll_t::META_COLL, log_oid, keys_to_rm);
// raise tail?
if (tail < s)
t->omap_rmkeys(coll_t::META_COLL, infos_oid, keys_to_remove);
}
-void PGLog::trim(ObjectStore::Transaction& t, eversion_t trim_to, pg_info_t &info, hobject_t &log_oid)
+void PGLog::trim(eversion_t trim_to, pg_info_t &info)
{
// trim?
if (trim_to > log.tail) {
assert(trim_to <= info.last_complete);
dout(10) << "trim " << log << " to " << trim_to << dendl;
- log.trim(t, log_oid, trim_to);
+ log.trim(trim_to);
info.log_tail = log.tail;
+
+ if (log.log.empty()) {
+ mark_dirty_to(eversion_t::max());
+ } else {
+ mark_dirty_to(log.log.front().version);
+ }
}
}
caller_ops[e.reqid] = &(log.back());
}
- void trim(ObjectStore::Transaction &t, hobject_t& oid, eversion_t s);
+ void trim(eversion_t s);
ostream& print(ostream& out) const;
};
void unindex() { log.unindex(); }
- void add(pg_log_entry_t& e) { log.add(e); }
+ void add(pg_log_entry_t& e) {
+ mark_dirty_from(e.version);
+ log.add(e);
+ }
void reset_recovery_pointers() { log.reset_recovery_pointers(); }
const hobject_t &log_oid,
ObjectStore::Transaction *t);
- void trim(ObjectStore::Transaction& t, eversion_t trim_to, pg_info_t &info, hobject_t &log_oid);
+ void trim(eversion_t trim_to, pg_info_t &info);
//////////////////// get or set log & missing ////////////////////
} else {
// just trim the log
if (m->pg_trim_to != eversion_t()) {
- pg_log.trim(rm->localt, m->pg_trim_to, info, log_oid);
+ pg_log.trim(m->pg_trim_to, info);
+ dirty_info = true;
+ write_if_dirty(rm->localt);
rm->tls.push_back(&rm->localt);
}
}