limit :
first_non_divergent->version;
- // We need to preserve the original crt before it gets updated in rewind_from_head().
- // Later, in merge_object_divergent_entries(), we use it to check whether we can rollback
- // a divergent entry or not.
- eversion_t original_crt = log.get_can_rollback_to();
- dout(20) << __func__ << " original_crt = " << original_crt << dendl;
+ // we merge and adjust the replica's log, rollback the rollbackable divergent entry,
+ // remove the unrollbackable divergent entry and mark the according object as missing.
+ // the rollback boundary must choose crt of the olog which going to be merged.
+ // The replica log's(olog) crt will not be modified, so it could get passed
+ // to _merge_divergent_entries() directly.
IndexedLog folog(olog);
auto divergent = folog.rewind_from_head(lu);
_merge_divergent_entries(
divergent,
oinfo,
olog.get_can_rollback_to(),
- original_crt,
omissing,
0,
this);
log,
divergent,
info,
- log.get_can_rollback_to(),
original_crt,
missing,
rollbacker,
log,
divergent,
info,
- log.get_can_rollback_to(),
original_crt,
missing,
rollbacker,
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);