From f0ca14df0641daa04eee39d98d8bd0faf46e4e6d Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Sun, 9 Aug 2015 10:46:10 -0400 Subject: [PATCH] osd/PGLog: dirty_to is inclusive There are only two callers of mark_dirty_to who do not pass max, and they are both in the merge_log extending tail path. In that case, we want to include the last version specified in the log writeout. Fix the tail extending code to always specify the last entry added, inclusive. Fixes: #12652 Signed-off-by: Sage Weil --- src/osd/PGLog.cc | 11 +++++------ src/osd/PGLog.h | 6 +++--- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/osd/PGLog.cc b/src/osd/PGLog.cc index 0347a779e9e5..a6137c4a7584 100644 --- a/src/osd/PGLog.cc +++ b/src/osd/PGLog.cc @@ -581,6 +581,7 @@ void PGLog::merge_log(ObjectStore::Transaction& t, dout(10) << "merge_log extending tail to " << olog.tail << dendl; list::iterator from = olog.log.begin(); list::iterator to; + eversion_t last; for (to = from; to != olog.log.end(); ++to) { @@ -588,12 +589,10 @@ void PGLog::merge_log(ObjectStore::Transaction& t, break; log.index(*to); dout(15) << *to << dendl; + last = to->version; } - - if (to == olog.log.end()) - mark_dirty_to(oinfo.last_update); - else - mark_dirty_to(to->version); + mark_dirty_to(last); + // splice into our log. log.log.splice(log.log.begin(), olog.log, from, to); @@ -825,7 +824,7 @@ void PGLog::_write_log( } for (list::iterator p = log.log.begin(); - p != log.log.end() && p->version < dirty_to; + p != log.log.end() && p->version <= dirty_to; ++p) { bufferlist bl(sizeof(*p) * 2); p->encode_with_checksum(bl); diff --git a/src/osd/PGLog.h b/src/osd/PGLog.h index 00cba0d70c60..99aa67034dff 100644 --- a/src/osd/PGLog.h +++ b/src/osd/PGLog.h @@ -307,9 +307,9 @@ protected: /// Log is clean on [dirty_to, dirty_from) bool touched_log; - eversion_t dirty_to; ///< must clear/writeout all keys up to dirty_to - eversion_t dirty_from; ///< must clear/writeout all keys past dirty_from - eversion_t writeout_from; ///< must writout keys past writeout_from + eversion_t dirty_to; ///< must clear/writeout all keys <= dirty_to + eversion_t dirty_from; ///< must clear/writeout all keys >= dirty_from + eversion_t writeout_from; ///< must writout keys >= writeout_from set trimmed; ///< must clear keys in trimmed bool dirty_divergent_priors; CephContext *cct; -- 2.47.3