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:
Kefu Chai 2019-08-23 14:59:02 +08:00 committed by GitHub
commit e909031d3c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 9 additions and 24 deletions

View File

@ -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,

View File

@ -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);

View File

@ -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