]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: fix break inside of yield in RGWFetchAllMetaCR 11586/head
authorCasey Bodley <cbodley@redhat.com>
Thu, 20 Oct 2016 19:01:01 +0000 (15:01 -0400)
committerCasey Bodley <cbodley@redhat.com>
Tue, 29 Nov 2016 20:55:27 +0000 (15:55 -0500)
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 <cbodley@redhat.com>
src/rgw/rgw_sync.cc

index c44305edf33c3fd9c98bdad58066e3b0ee8c3c3e..c6f3acbae2ddf6d21f7f4f47ceeb400bf511c7ec 100644 (file)
@@ -837,27 +837,25 @@ public:
         }
         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 {