]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: avoid prep_object_replica_pushes() on clone object when head missing 27575/head
authorZengran Zhang <zhangzengran@sangfor.com.cn>
Thu, 18 Apr 2019 12:44:11 +0000 (20:44 +0800)
committerZengran Zhang <zhangzengran@sangfor.com.cn>
Thu, 23 May 2019 12:07:53 +0000 (20:07 +0800)
the leak path:
maybe_kick_recovery() -> prep_object_replica_pushes()

Fixes: http://tracker.ceph.com/issues/39286
Signed-off-by: Zengran Zhang <zhangzengran@sangfor.com.cn>
src/osd/PrimaryLogPG.cc
src/osd/ReplicatedBackend.cc

index af44294c0b86693b1c7a4dd4aa573ac1d29d82f7..f2765b165cbe775ff00c220934c7e881deefbd2a 100644 (file)
@@ -12539,6 +12539,24 @@ int PrimaryLogPG::prep_object_replica_pushes(
   ceph_assert(is_primary());
   dout(10) << __func__ << ": on " << soid << dendl;
 
+  if (soid.snap && soid.snap < CEPH_NOSNAP) {
+    // do we have the head and/or snapdir?
+    hobject_t head = soid.get_head();
+    if (recovery_state.get_pg_log().get_missing().is_missing(head)) {
+      if (recovering.count(head)) {
+       dout(10) << " missing but already recovering head " << head << dendl;
+       return 0;
+      } else {
+       int r = recover_missing(
+           head, recovery_state.get_pg_log().get_missing().get_items().find(head)->second.need,
+           get_recovery_op_priority(), h);
+       if (r != PULL_NONE)
+         return 1;
+       return 0;
+      }
+    }
+  }
+
   // NOTE: we know we will get a valid oloc off of disk here.
   ObjectContextRef obc = get_object_context(soid, false);
   if (!obc) {
index 81e2651d988bc9d618a1a67a721139c06855e2b8..c1634f9f714d0e3e2446b866eec1e3e25d4bfb8a 100644 (file)
@@ -1779,6 +1779,11 @@ bool ReplicatedBackend::handle_pull_response(
       a.second.rebuild();
     }
     pi.obc = get_parent()->get_obc(pi.recovery_info.soid, attrset);
+    if (attrset.find(SS_ATTR) != attrset.end()) {
+      bufferlist ssbv = attrset.at(SS_ATTR);
+      SnapSet ss(ssbv);
+      assert(ss.seq  == pi.obc->ssc->snapset.seq);
+    }
     pi.recovery_info.oi = pi.obc->obs.oi;
     pi.recovery_info = recalc_subsets(
       pi.recovery_info,