]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
PG::proc_replica_log: oinfo.last_complete must be *before* first entry in omissing
authorSamuel Just <sam.just@inktank.com>
Fri, 22 Feb 2013 22:12:28 +0000 (14:12 -0800)
committerSamuel Just <sam.just@inktank.com>
Wed, 20 Mar 2013 22:19:17 +0000 (15:19 -0700)
Fixes: #4189
Signed-off-by: Samuel Just <sam.just@inktank.com>
(cherry picked from commit 2dae6a68ee85a20220ee940dbe33a2144d43457b)

src/osd/PG.cc

index e17ef639f40f992faef6466fb0f29a031cc6a9f8..60ec8e4f66222137ee75b80108094928177a89b2 100644 (file)
@@ -268,10 +268,23 @@ void PG::proc_replica_log(ObjectStore::Transaction& t,
   if (lu < oinfo.last_update) {
     dout(10) << " peer osd." << from << " last_update now " << lu << dendl;
     oinfo.last_update = lu;
-    if (lu < oinfo.last_complete)
-      oinfo.last_complete = lu;
-    if (omissing.have_missing())
-      oinfo.last_complete = omissing.missing[omissing.rmissing.begin()->second].need;
+  }
+
+  if (omissing.have_missing()) {
+    eversion_t first_missing =
+      omissing.missing[omissing.rmissing.begin()->second].need;
+    oinfo.last_complete = eversion_t();
+    list<pg_log_entry_t>::const_iterator i = olog.log.begin();
+    for (;
+        i != olog.log.end();
+        ++i) {
+      if (i->version < first_missing)
+       oinfo.last_complete = i->version;
+      else
+       break;
+    }
+  } else {
+    oinfo.last_complete = oinfo.last_update;
   }
 
   peer_info[from] = oinfo;