mempool::osd_pglog::list<pg_log_entry_t>::reverse_iterator
rollback_info_trimmed_to_riter;
+ /*
+ * return true if we need to mark the pglog as dirty
+ */
template <typename F>
- void advance_can_rollback_to(eversion_t to, F &&f) {
- if (to > can_rollback_to)
- can_rollback_to = to;
-
- if (to > rollback_info_trimmed_to)
- rollback_info_trimmed_to = to;
+ bool advance_can_rollback_to(eversion_t to, F &&f) {
+ bool dirty_log = to > can_rollback_to || to > rollback_info_trimmed_to;
+ if (dirty_log) {
+ if (to > can_rollback_to)
+ can_rollback_to = 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;
}
f(*rollback_info_trimmed_to_riter);
}
+
+ return dirty_log;
}
void reset_rollback_info_trimmed_to_riter() {
h->trim(entry);
});
}
- void roll_forward_to(eversion_t to, LogEntryHandler *h) {
- advance_can_rollback_to(
+ bool roll_forward_to(eversion_t to, LogEntryHandler *h) {
+ return advance_can_rollback_to(
to,
[&](pg_log_entry_t &entry) {
h->rollforward(entry);
bool pg_log_debug;
/// Log is clean on [dirty_to, dirty_from)
bool touched_log;
+ bool dirty_log;
bool clear_divergent_priors;
bool rebuilt_missing_with_deletes = false;
}
public:
bool is_dirty() const {
- return !touched_log ||
+ return !touched_log || dirty_log ||
(dirty_to != eversion_t()) ||
(dirty_from != eversion_t::max()) ||
(writeout_from != eversion_t::max()) ||
dirty_to = eversion_t();
dirty_from = eversion_t::max();
touched_log = true;
+ dirty_log = false;
trimmed.clear();
trimmed_dups.clear();
writeout_from = eversion_t::max();
cct(cct),
pg_log_debug(!(cct && !(cct->_conf->osd_debug_pg_log_writeout))),
touched_log(false),
+ dirty_log(false),
clear_divergent_priors(false)
{ }
void roll_forward_to(
eversion_t roll_forward_to,
LogEntryHandler *h) {
- log.roll_forward_to(
- roll_forward_to,
- h);
+ if (log.roll_forward_to(
+ roll_forward_to,
+ h))
+ dirty_log = true;
}
eversion_t get_can_rollback_to() const {
const hobject_t &hoid, ///< [in] object we are merging
const mempool::osd_pglog::list<pg_log_entry_t> &orig_entries, ///< [in] entries for hoid to merge
const pg_info_t &info, ///< [in] info for merging entries
- eversion_t olog_can_rollback_to, ///< [in] rollback boundary
- eversion_t original_can_rollback_to, ///< [in] original rollback boundary
+ eversion_t olog_can_rollback_to, ///< [in] rollback boundary of input InedexedLog
missing_type &missing, ///< [in,out] missing to adjust, use
LogEntryHandler *rollbacker, ///< [in] optional rollbacker object
const DoutPrefixProvider *dpp ///< [in] logging provider
ldpp_dout(dpp, 10) << __func__ << ": hoid " << hoid
<< " olog_can_rollback_to: "
<< olog_can_rollback_to << dendl;
- ldpp_dout(dpp, 10) << __func__ << ": hoid " << hoid
- << " original_crt: "
- << original_can_rollback_to << dendl;
/// Distinguish between 4) and 5)
for (list<pg_log_entry_t>::const_reverse_iterator i = entries.rbegin();
i != entries.rend();
++i) {
- /// Use original_can_rollback_to instead of olog_can_rollback_to to check
- // if we can rollback or not. This is to ensure that we don't try to rollback
- // to an object that has been deleted and doesn't exist.
- if (!i->can_rollback() || i->version <= original_can_rollback_to) {
+ if (!i->can_rollback() || i->version <= olog_can_rollback_to) {
ldpp_dout(dpp, 10) << __func__ << ": hoid " << hoid << " cannot rollback "
<< *i << dendl;
can_rollback = false;
for (list<pg_log_entry_t>::const_reverse_iterator i = entries.rbegin();
i != entries.rend();
++i) {
- ceph_assert(i->can_rollback() && i->version > original_can_rollback_to);
+ ceph_assert(i->can_rollback() && i->version > olog_can_rollback_to);
ldpp_dout(dpp, 10) << __func__ << ": hoid " << hoid
<< " rolling back " << *i << dendl;
if (rollbacker)
const IndexedLog &log, ///< [in] log to merge against
mempool::osd_pglog::list<pg_log_entry_t> &entries, ///< [in] entries to merge
const pg_info_t &oinfo, ///< [in] info for merging entries
- eversion_t olog_can_rollback_to, ///< [in] rollback boundary
- eversion_t original_can_rollback_to, ///< [in] original rollback boundary
+ eversion_t olog_can_rollback_to, ///< [in] rollback boundary of input IndexedLog
missing_type &omissing, ///< [in,out] missing to adjust, use
LogEntryHandler *rollbacker, ///< [in] optional rollbacker object
const DoutPrefixProvider *dpp ///< [in] logging provider
i->second,
oinfo,
olog_can_rollback_to,
- original_can_rollback_to,
omissing,
rollbacker,
dpp);
entries,
info,
log.get_can_rollback_to(),
- log.get_can_rollback_to(),
missing,
rollbacker,
this);