state_set(PG_STATE_ACTIVATING);
}
+ if (acting.size() >= pool.info.min_size) {
+ PGLogEntryHandler handler;
+ pg_log.roll_forward(&handler);
+ handler.apply(this, &t);
+ }
}
bool PG::op_has_sufficient_caps(OpRequestRef& op)
PGLogEntryHandler handler;
if (!transaction_applied) {
- pg_log.clear_can_rollback_to(&handler);
+ pg_log.roll_forward(&handler);
t.register_on_applied(
new C_UpdateLastRollbackInfoTrimmedToApplied(
this,
get_osdmap()->get_epoch(),
info.last_update));
} else if (roll_forward_to > pg_log.get_rollback_trimmed_to()) {
- pg_log.trim_rollback_info(
+ pg_log.roll_forward_to(
roll_forward_to,
&handler);
t.register_on_applied(
pg_log.trim(&handler, trim_to, info);
- dout(10) << __func__ << ": trimming to " << roll_forward_to
+ dout(10) << __func__ << ": rolling forward to " << roll_forward_to
<< " entries " << handler.to_trim << dendl;
handler.apply(this, &t);
void rollback(const pg_log_entry_t &entry) {
to_rollback.push_back(entry);
}
+ void rollforward(const pg_log_entry_t &entry) {
+ to_trim.push_back(entry);
+ }
void trim(const pg_log_entry_t &entry) {
to_trim.push_back(entry);
}
//////////////////// PGLog::IndexedLog ////////////////////
-void PGLog::IndexedLog::advance_rollback_info_trimmed_to(
- eversion_t to,
- LogEntryHandler *h)
-{
- assert(to <= can_rollback_to);
-
- if (to > rollback_info_trimmed_to)
- rollback_info_trimmed_to = to;
-
- while (rollback_info_trimmed_to_riter != log.rbegin()) {
- --rollback_info_trimmed_to_riter;
- if (rollback_info_trimmed_to_riter->version > rollback_info_trimmed_to) {
- ++rollback_info_trimmed_to_riter;
- break;
- }
- h->trim(*rollback_info_trimmed_to_riter);
- }
-}
-
void PGLog::IndexedLog::filter_log(spg_t pgid, const OSDMap &map, const string &hit_set_namespace)
{
IndexedLog out;
if (s > can_rollback_to)
can_rollback_to = s;
- advance_rollback_info_trimmed_to(s, handler);
+ trim_rollback_info_to(s, handler);
while (!log.empty()) {
pg_log_entry_t &e = *log.begin();
struct LogEntryHandler {
virtual void rollback(
const pg_log_entry_t &entry) = 0;
+ virtual void rollforward(
+ const pg_log_entry_t &entry) = 0;
virtual void remove(
const hobject_t &hoid) = 0;
virtual void try_stash(
*/
list<pg_log_entry_t>::reverse_iterator rollback_info_trimmed_to_riter;
public:
- void advance_rollback_info_trimmed_to(eversion_t to, LogEntryHandler *h);
+ template <typename F>
+ void advance_can_rollback_to(eversion_t to, F &&f) {
+ assert(to <= can_rollback_to);
+
+ if (to > rollback_info_trimmed_to)
+ rollback_info_trimmed_to = to;
+
+ while (rollback_info_trimmed_to_riter != log.rbegin()) {
+ --rollback_info_trimmed_to_riter;
+ if (rollback_info_trimmed_to_riter->version > rollback_info_trimmed_to) {
+ ++rollback_info_trimmed_to_riter;
+ break;
+ }
+ f(*rollback_info_trimmed_to_riter);
+ }
+ }
+ void trim_rollback_info_to(eversion_t to, LogEntryHandler *h) {
+ advance_can_rollback_to(
+ to,
+ [&](pg_log_entry_t &entry) {
+ h->trim(entry);
+ });
+ }
+ void roll_forward_to(eversion_t to, LogEntryHandler *h) {
+ advance_can_rollback_to(
+ to,
+ [&](pg_log_entry_t &entry) {
+ h->rollforward(entry);
+ });
+ }
/****/
IndexedLog() :
eversion_t trim_to,
pg_info_t &info);
- void trim_rollback_info(
+ void roll_forward_to(
eversion_t roll_forward_to,
LogEntryHandler *h) {
if (roll_forward_to > log.can_rollback_to)
log.can_rollback_to = roll_forward_to;
- log.advance_rollback_info_trimmed_to(
+ log.roll_forward_to(
roll_forward_to,
h);
}
return log.rollback_info_trimmed_to;
}
- void clear_can_rollback_to(LogEntryHandler *h) {
- log.can_rollback_to = log.head;
- log.advance_rollback_info_trimmed_to(
+ void roll_forward(LogEntryHandler *h) {
+ roll_forward_to(
log.head,
h);
}
void reset_backfill_claim_log(const pg_log_t &o, LogEntryHandler *h) {
log.can_rollback_to = log.head;
- log.advance_rollback_info_trimmed_to(log.head, h);
+ log.trim_rollback_info_to(log.head, h);
log.claim_log_and_clear_rollback_info(o);
missing.clear();
mark_dirty_to(eversion_t::max());
set<hobject_t, hobject_t::BitwiseComparator> did;
set<hobject_t, hobject_t::BitwiseComparator> checked;
+ set<hobject_t, hobject_t::BitwiseComparator> skipped;
for (list<pg_log_entry_t>::reverse_iterator i = log.log.rbegin();
i != log.log.rend();
++i) {
if (did.count(i->soid)) continue;
did.insert(i->soid);
+ if (i->version > log.can_rollback_to && i->is_rollforward())
+ checked.insert(i->soid);
+
if (i->is_delete()) continue;
bufferlist bv;
// clear log
PGLogEntryHandler rollbacker;
- pg_log.clear_can_rollback_to(&rollbacker);
+ pg_log.roll_forward(&rollbacker);
rollbacker.apply(this, t);
write_if_dirty(*t);
(op == MODIFY || op == DELETE || op == ERROR);
}
+ bool is_rollforward() const { /* TODO */ return false; }
+
string get_key_name() const;
void encode_with_checksum(bufferlist& bl) const;
void decode_with_checksum(bufferlist::iterator& p);
const pg_log_entry_t &entry) {
rolledback.push_back(entry);
}
+ void rollforward(
+ const pg_log_entry_t &entry) {}
void remove(
const hobject_t &hoid) {
removed.insert(hoid);
void rollback(
const pg_log_entry_t &entry) {}
+ void rollforward(
+ const pg_log_entry_t &entry) {}
void remove(
const hobject_t &hoid) {
removed.push_back(hoid);
add(e);
}
TestHandler h(remove_snap);
- trim_rollback_info(eversion_t(1, 6), &h);
+ roll_forward_to(eversion_t(1, 6), &h);
rewind_divergent_log(t, eversion_t(1, 5), info, &h,
dirty_info, dirty_big_info);
pg_log_t log;