mirror of
https://github.com/ceph/ceph
synced 2025-02-24 11:37:37 +00:00
Merge pull request #29590 from Aran85/fix_proc_replica_log
osd: merge replica log on primary need according to replica log's crt Reviewed-by: Neha Ojha <nojha@redhat.com>
This commit is contained in:
commit
e909031d3c
@ -269,11 +269,11 @@ void PGLog::proc_replica_log(
|
||||
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(
|
||||
@ -281,7 +281,6 @@ void PGLog::proc_replica_log(
|
||||
divergent,
|
||||
oinfo,
|
||||
olog.get_can_rollback_to(),
|
||||
original_crt,
|
||||
omissing,
|
||||
0,
|
||||
this);
|
||||
@ -345,7 +344,6 @@ void PGLog::rewind_divergent_log(eversion_t newhead,
|
||||
log,
|
||||
divergent,
|
||||
info,
|
||||
log.get_can_rollback_to(),
|
||||
original_crt,
|
||||
missing,
|
||||
rollbacker,
|
||||
@ -471,7 +469,6 @@ void PGLog::merge_log(pg_info_t &oinfo, pg_log_t &olog, pg_shard_t fromosd,
|
||||
log,
|
||||
divergent,
|
||||
info,
|
||||
log.get_can_rollback_to(),
|
||||
original_crt,
|
||||
missing,
|
||||
rollbacker,
|
||||
|
@ -898,8 +898,7 @@ protected:
|
||||
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
|
||||
@ -1063,17 +1062,11 @@ protected:
|
||||
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;
|
||||
@ -1086,7 +1079,7 @@ protected:
|
||||
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)
|
||||
@ -1122,8 +1115,7 @@ protected:
|
||||
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
|
||||
@ -1139,7 +1131,6 @@ protected:
|
||||
i->second,
|
||||
oinfo,
|
||||
olog_can_rollback_to,
|
||||
original_can_rollback_to,
|
||||
omissing,
|
||||
rollbacker,
|
||||
dpp);
|
||||
@ -1163,7 +1154,6 @@ protected:
|
||||
entries,
|
||||
info,
|
||||
log.get_can_rollback_to(),
|
||||
log.get_can_rollback_to(),
|
||||
missing,
|
||||
rollbacker,
|
||||
this);
|
||||
|
@ -2931,7 +2931,6 @@ TEST_F(PGLogTest, _merge_object_divergent_entries) {
|
||||
_merge_object_divergent_entries(log, hoid,
|
||||
orig_entries, oinfo,
|
||||
log.get_can_rollback_to(),
|
||||
log.get_can_rollback_to(),
|
||||
missing, &rollbacker,
|
||||
this);
|
||||
// No core dump
|
||||
@ -2958,7 +2957,6 @@ TEST_F(PGLogTest, _merge_object_divergent_entries) {
|
||||
_merge_object_divergent_entries(log, hoid,
|
||||
orig_entries, oinfo,
|
||||
log.get_can_rollback_to(),
|
||||
log.get_can_rollback_to(),
|
||||
missing, &rollbacker,
|
||||
this);
|
||||
// No core dump
|
||||
|
Loading…
Reference in New Issue
Block a user