]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/PGLog: dirty_to is inclusive 5820/head
authorSage Weil <sage@redhat.com>
Sun, 9 Aug 2015 14:46:10 +0000 (10:46 -0400)
committerNathan Cutler <ncutler@suse.com>
Sat, 5 Sep 2015 09:21:12 +0000 (11:21 +0200)
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 <sage@redhat.com>
(cherry picked from commit f0ca14df0641daa04eee39d98d8bd0faf46e4e6d)

src/osd/PGLog.cc
src/osd/PGLog.h

index f08105513549cb4cfac2d2b6c782da209331e1f5..7f35f7dbefe603c2140a2959853a132ca99d2b83 100644 (file)
@@ -560,6 +560,7 @@ void PGLog::merge_log(ObjectStore::Transaction& t,
     dout(10) << "merge_log extending tail to " << olog.tail << dendl;
     list<pg_log_entry_t>::iterator from = olog.log.begin();
     list<pg_log_entry_t>::iterator to;
+    eversion_t last;
     for (to = from;
         to != olog.log.end();
         ++to) {
@@ -567,12 +568,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);
@@ -794,7 +793,7 @@ void PGLog::_write_log(
 
   map<string,bufferlist> keys;
   for (list<pg_log_entry_t>::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);
index 18739f5094486bfbe6b84f9d79fb6e06505ae057..508b295fd9c6959cb42b6648e32e688bf29cc0f9 100644 (file)
@@ -212,9 +212,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<eversion_t> trimmed;     ///< must clear keys in trimmed
   bool dirty_divergent_priors;
   CephContext *cct;