diff --git a/src/rgw/rgw_sync.cc b/src/rgw/rgw_sync.cc index c53a2cd5da6..474e2c558d8 100644 --- a/src/rgw/rgw_sync.cc +++ b/src/rgw/rgw_sync.cc @@ -1668,8 +1668,13 @@ class RGWMetaSyncCR : public RGWCoroutine { std::mutex mutex; //< protect access to shard_crs + // TODO: it should be enough to hold a reference on the stack only, as calling + // RGWCoroutinesStack::wakeup() doesn't refer to the RGWCoroutine if it has + // already completed using ControlCRRef = boost::intrusive_ptr<RGWMetaSyncShardControlCR>; - map<int, ControlCRRef> shard_crs; + using StackRef = boost::intrusive_ptr<RGWCoroutinesStack>; + using RefPair = std::pair<ControlCRRef, StackRef>; + map<int, RefPair> shard_crs; public: RGWMetaSyncCR(RGWMetaSyncEnv *_sync_env, RGWPeriodHistory::Cursor cursor, @@ -1727,8 +1732,8 @@ public: auto cr = new RGWMetaSyncShardControlCR(sync_env, pool, period_id, mdlog, shard_id, marker, std::move(period_marker)); - shard_crs[shard_id] = cr; - spawn(cr, false); + auto stack = spawn(cr, false); + shard_crs[shard_id] = RefPair{cr, stack}; } } // wait for each shard to complete @@ -1764,7 +1769,7 @@ public: if (iter == shard_crs.end()) { return; } - iter->second->wakeup(); + iter->second.first->wakeup(); } };