From 335a7326a9e8416b114467096d938fafe6b09605 Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Wed, 21 Dec 2016 14:32:04 -0500 Subject: [PATCH] rgw: RGWMetaSyncShardCR drops stack refs on destruction if the coroutine is canceled before collect_children() can clean up all of its child stacks, those stack refs will leak. store these stacks as boost::intrusive_ptr so the ref is dropped automatically on destruction Fixes: http://tracker.ceph.com/issues/18300 Signed-off-by: Casey Bodley (cherry picked from commit 060fe72faf6a483a36d481207c6624c46a414231) --- src/rgw/rgw_sync.cc | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/rgw/rgw_sync.cc b/src/rgw/rgw_sync.cc index 6e8beb80fe387..7764062fc0948 100644 --- a/src/rgw/rgw_sync.cc +++ b/src/rgw/rgw_sync.cc @@ -1258,7 +1258,9 @@ class RGWMetaSyncShardCR : public RGWCoroutine { bool *reset_backoff; - map stack_to_pos; + // hold a reference to the cr stack while it's in the map + using StackRef = boost::intrusive_ptr; + map stack_to_pos; map pos_to_prev; bool can_adjust_marker = false; @@ -1320,7 +1322,7 @@ public: int child_ret; RGWCoroutinesStack *child; while (collect_next(&child_ret, &child)) { - map::iterator iter = stack_to_pos.find(child); + auto iter = stack_to_pos.find(child); if (iter == stack_to_pos.end()) { /* some other stack that we don't care about */ continue; @@ -1360,8 +1362,6 @@ public: ldout(sync_env->cct, 0) << *this << ": adjusting marker pos=" << sync_marker.marker << dendl; stack_to_pos.erase(iter); - - child->put(); } } @@ -1432,8 +1432,7 @@ public: // fetch remote and write locally yield { RGWCoroutinesStack *stack = spawn(new RGWMetaSyncSingleEntryCR(sync_env, iter->first, iter->first, MDLOG_STATUS_COMPLETE, marker_tracker), false); - stack->get(); - + // stack_to_pos holds a reference to the stack stack_to_pos[stack] = iter->first; pos_to_prev[iter->first] = marker; } @@ -1581,8 +1580,7 @@ public: yield { RGWCoroutinesStack *stack = spawn(new RGWMetaSyncSingleEntryCR(sync_env, raw_key, log_iter->id, mdlog_entry.log_data.status, marker_tracker), false); assert(stack); - stack->get(); - + // stack_to_pos holds a reference to the stack stack_to_pos[stack] = log_iter->id; pos_to_prev[log_iter->id] = marker; } -- 2.39.5