From: Kefu Chai Date: Mon, 25 Jul 2016 03:12:14 +0000 (+0800) Subject: osd: fix the mem leak of RepGather X-Git-Tag: v10.2.3~2^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=dc154cd1e497b02386b91fde28a658d79ec6659e;p=ceph.git osd: fix the mem leak of RepGather ReplicatedPG::new_repop() returns a pointer to RepGather with two refcounts, one is held by ReplicatedPG::repop_queue, the other is supposed to be held by the caller of this function. but it's caller ReplicatedPG::submit_log_entries() assigns it to a boost::intrusive_ptr() directly, why by default add_ref() in its constructor. this makes the refcount 3. that's why we have a leak of RepGather in `ReplicatedPG::new_repop(ObcLockManager&&, boost::optional>&&)`. Fixes: http://tracker.ceph.com/issues/16801 Signed-off-by: Kefu Chai (cherry picked from commit d3a28465fc7b7002f38cff364fdf601f7486add3) --- diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 5e8af4eaa205..6dfa97b7cb0b 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -8530,7 +8530,7 @@ ReplicatedPG::RepGather *ReplicatedPG::new_repop( return repop; } -ReplicatedPG::RepGather *ReplicatedPG::new_repop( +boost::intrusive_ptr ReplicatedPG::new_repop( ObcLockManager &&manager, boost::optional > &&on_complete) { @@ -8543,11 +8543,10 @@ ReplicatedPG::RepGather *ReplicatedPG::new_repop( repop->start = ceph_clock_now(cct); repop_queue.push_back(&repop->queue_item); - repop->get(); osd->logger->inc(l_osd_op_wip); - return repop; + return boost::intrusive_ptr(repop); } void ReplicatedPG::remove_repop(RepGather *repop) diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index 47a6a1613d3a..cfbfbe514626 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -878,7 +878,7 @@ protected: OpContext *ctx, ObjectContextRef obc, ceph_tid_t rep_tid); - RepGather *new_repop( + boost::intrusive_ptr new_repop( ObcLockManager &&manager, boost::optional > &&on_complete); void remove_repop(RepGather *repop);