]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
PGLog::rewind_divergent_log must not call mark_dirty_from on end() 366/head
authorLoic Dachary <loic@dachary.org>
Wed, 19 Jun 2013 20:50:30 +0000 (22:50 +0200)
committerLoic Dachary <loic@dachary.org>
Wed, 19 Jun 2013 20:50:30 +0000 (22:50 +0200)
PGLog::rewind_divergent_log is dereferencing iterator "p" though it is
already past the end of its container. When entering the loop for the
first time, p is log.log.end() and must not be dereferenced.

mark_dirty_from must only be called after p--. It
will not rewind past begin() because of the

  if (p == log.log.begin())

test above.

http://tracker.ceph.com/issues/5398 fixes #5398

Signed-off-by: Loic Dachary <loic@dachary.org>
src/osd/PGLog.cc

index d62991e06d67aa89fb2fe47dd2147132149a6ff3..785bdc584ad5da25723266556e978ad4a8de01ec 100644 (file)
@@ -366,8 +366,8 @@ void PGLog::rewind_divergent_log(ObjectStore::Transaction& t, eversion_t newhead
       divergent.swap(log.log);
       break;
     }
-    mark_dirty_from(p->version);
     --p;
+    mark_dirty_from(p->version);
     if (p->version == newhead) {
       ++p;
       divergent.splice(divergent.begin(), log.log, p, log.log.end());