From 076e4b7991e3bd734a41604fa7cb00c7b03d7749 Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Thu, 20 Oct 2016 15:01:01 -0400 Subject: [PATCH] rgw: fix break inside of yield in RGWFetchAllMetaCR the yield macro is implemented with for/switch, so the breaks in RGWFetchAllMetaCR weren't being applied to the for loop as expected - so any of these breaks send RGWFetchAllMetaCR into an infinite loop removed the yield {} block, so that breaks will apply to the for loop as intended, then added a single yield; statement to allow the entries_index consumer to run one per iteration Fixes: http://tracker.ceph.com/issues/17655 Signed-off-by: Casey Bodley (cherry picked from commit 190bd385a7be52867d65740c410884f5c8cbc21f) --- src/rgw/rgw_sync.cc | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/src/rgw/rgw_sync.cc b/src/rgw/rgw_sync.cc index c47dd4b799719..73720851fe9e1 100644 --- a/src/rgw/rgw_sync.cc +++ b/src/rgw/rgw_sync.cc @@ -837,27 +837,25 @@ class RGWFetchAllMetaCR : public RGWCoroutine { } iter = result.begin(); for (; iter != result.end(); ++iter) { - RGWRados *store; - int ret; - yield { - if (!lease_cr->is_locked()) { - lost_lock = true; - break; - } - ldout(cct, 20) << "list metadata: section=" << *sections_iter << " key=" << *iter << dendl; - string s = *sections_iter + ":" + *iter; - int shard_id; - store = sync_env->store; - ret = store->meta_mgr->get_log_shard_id(*sections_iter, *iter, &shard_id); - if (ret < 0) { - ldout(cct, 0) << "ERROR: could not determine shard id for " << *sections_iter << ":" << *iter << dendl; - ret_status = ret; - break; - } - if (!entries_index->append(s, shard_id)) { - break; - } - } + if (!lease_cr->is_locked()) { + lost_lock = true; + break; + } + yield; // allow entries_index consumer to make progress + + ldout(cct, 20) << "list metadata: section=" << *sections_iter << " key=" << *iter << dendl; + string s = *sections_iter + ":" + *iter; + int shard_id; + RGWRados *store = sync_env->store; + int ret = store->meta_mgr->get_log_shard_id(*sections_iter, *iter, &shard_id); + if (ret < 0) { + ldout(cct, 0) << "ERROR: could not determine shard id for " << *sections_iter << ":" << *iter << dendl; + ret_status = ret; + break; + } + if (!entries_index->append(s, shard_id)) { + break; + } } } yield {