void PG::trim_peers()
{
- dout(10) << "trim_peers" << dendl;
- for (unsigned i=1; i<acting.size(); i++)
- osd->messenger->send_message(new MOSDPGTrim(osd->osdmap->get_epoch(), info.pgid, min_last_complete_ondisk),
- osd->osdmap->get_inst(acting[i]));
+ calc_trim_to();
+ dout(10) << "trim_peers " << pg_trim_to << dendl;
+ if (pg_trim_to != eversion_t()) {
+ for (unsigned i=1; i<acting.size(); i++)
+ osd->messenger->send_message(new MOSDPGTrim(osd->osdmap->get_epoch(), info.pgid,
+ pg_trim_to),
+ osd->osdmap->get_inst(acting[i]));
+ }
}
int role; // 0 = primary, 1 = replica, -1=none.
int state; // see bit defns above
+public:
+ eversion_t last_complete_ondisk; // last_complete that has committed.
+
// primary state
public:
vector<int> acting;
- eversion_t last_complete_ondisk; // last_complete that has committed.
-
- // [primary only] content recovery state
map<int,eversion_t> peer_last_complete_ondisk;
eversion_t min_last_complete_ondisk; // min over last_complete_ondisk, peer_last_complete_ondisk
+ eversion_t pg_trim_to;
+
+ // [primary only] content recovery state
bool have_master_log;
protected:
set<int> prior_set; // current+prior OSDs, as defined by info.history.last_epoch_started.
return true;
}
+ virtual void calc_trim_to() = 0;
+
void proc_replica_log(ObjectStore::Transaction& t, Info &oinfo, Log &olog, Missing& omissing, int from);
bool merge_old_entry(ObjectStore::Transaction& t, Log::Entry& oe);
void merge_log(ObjectStore::Transaction& t, Info &oinfo, Log &olog, Missing& omissing, int from);
delete op;
}
+void ReplicatedPG::calc_trim_to()
+{
+ if (is_clean() ||
+ log.top.version - log.bottom.version > info.stats.num_objects) {
+ pg_trim_to = min_last_complete_ondisk;
+ if (pg_trim_to != eversion_t()) {
+ assert(pg_trim_to >= log.bottom);
+ assert(pg_trim_to <= log.top);
+ }
+ } else
+ pg_trim_to = eversion_t();
+}
/** do_op - do an op
* pg lock will be held (if multithreaded)
assert(op->may_write());
// trim log?
- if (is_clean() ||
- log.top.version - log.bottom.version > info.stats.num_objects)
- ctx->trim_to = min_last_complete_ondisk;
+ calc_trim_to();
- log_op(ctx->log, ctx->trim_to, ctx->local_t);
+ log_op(ctx->log, pg_trim_to, ctx->local_t);
}
// continuing on to write path, make sure object context is registered
::encode(repop->ctx->log, wr->logbl);
}
- wr->pg_trim_to = repop->ctx->trim_to;
+ wr->pg_trim_to = pg_trim_to;
wr->peer_stat = osd->get_my_stat_for(now, dest);
osd->messenger->send_message(wr, osd->osdmap->get_inst(dest));
}
ObjectStore::Transaction op_t, local_t;
vector<PG::Log::Entry> log;
- eversion_t trim_to;
ObjectContext *clone_obc; // if we created a clone
void apply_and_flush_repops(bool requeue);
+ void calc_trim_to();
public:
ReplicatedPG(OSD *o, PGPool *_pool, pg_t p, const sobject_t& oid) :