]> git.apps.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>
Fri, 22 Feb 2013 22:19:55 +0000 (14:19 -0800)
Fixes: #4189
Signed-off-by: Samuel Just <sam.just@inktank.com>
src/osd/PG.cc

index 12701f98638410ce0e37a01b7a50951496c52799..9974ee082dd851f06e2412a91eea109a73daa703 100644 (file)
@@ -275,10 +275,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;