]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/PGLog: dirty_to is inclusive 5518/head
authorSage Weil <sage@redhat.com>
Sun, 9 Aug 2015 14:46:10 +0000 (10:46 -0400)
committerSage Weil <sage@redhat.com>
Wed, 19 Aug 2015 21:13:28 +0000 (17:13 -0400)
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>
src/osd/PGLog.cc
src/osd/PGLog.h

index 0347a779e9e59ec1149809249f73b23fdd7c2d9b..a6137c4a7584b886dc176dedad9e2f0cf1f06a28 100644 (file)
@@ -581,6 +581,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) {
@@ -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<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 00cba0d70c60bb6bf7914e4e4e82f78022e2d43e..99aa67034dff3469e30ce6e1bf842d7ca41ed82a 100644 (file)
@@ -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<eversion_t> trimmed;     ///< must clear keys in trimmed
   bool dirty_divergent_priors;
   CephContext *cct;