]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: call drain_all() before returning from some crs
authorYehuda Sadeh <yehuda@redhat.com>
Tue, 17 Nov 2015 00:23:47 +0000 (16:23 -0800)
committerYehuda Sadeh <yehuda@redhat.com>
Fri, 12 Feb 2016 00:13:35 +0000 (16:13 -0800)
spawned crs are still using marker_tracker, need to drain_all() as
we destroy it in the destructor.

Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
src/rgw/rgw_data_sync.cc
src/rgw/rgw_sync.cc

index 1c179277dbf2d4d6aa3a3aa7ac0774c46dc52208..f4d7f13bf11a755783122a6475e1b80210bdbb23 100644 (file)
@@ -864,6 +864,7 @@ public:
         yield call(new RGWRadosGetOmapKeysCR(store, pool, oid, sync_marker.marker, &entries, max_entries));
         if (retcode < 0) {
           ldout(store->ctx(), 0) << "ERROR: " << __func__ << "(): RGWRadosGetOmapKeysCR() returned ret=" << retcode << dendl;
+          drain_all();
           return set_cr_error(retcode);
         }
         iter = entries.begin();
@@ -876,6 +877,7 @@ public:
             // fetch remote and write locally
             yield spawn(new RGWDataSyncSingleEntryCR(store, http_manager, async_rados, conn, source_zone, iter->first, iter->first, marker_tracker), false);
             if (retcode < 0) {
+              drain_all();
               return set_cr_error(retcode);
             }
           }
@@ -925,6 +927,7 @@ public:
         yield call(new RGWReadRemoteDataLogShardInfoCR(store, http_manager, async_rados, conn, shard_id, &shard_info));
         if (retcode < 0) {
           ldout(store->ctx(), 0) << "ERROR: failed to fetch remote data log info: ret=" << retcode << dendl;
+          drain_all();
           return set_cr_error(retcode);
         }
         datalog_marker = shard_info.marker;
@@ -943,6 +946,7 @@ public:
             } else {
               yield spawn(new RGWDataSyncSingleEntryCR(store, http_manager, async_rados, conn, source_zone, log_iter->entry.key, log_iter->log_id, marker_tracker), false);
               if (retcode < 0) {
+                drain_all();
                 return set_cr_error(retcode);
               }
             }
@@ -1900,6 +1904,7 @@ int RGWBucketShardFullSyncCR::operate()
       yield call(new RGWListBucketShardCR(store, http_manager, async_rados, conn, bucket_name, bucket_id, shard_id,
                                       list_marker, &list_result));
       if (retcode < 0 && retcode != -ENOENT) {
+        drain_all();
         return set_cr_error(retcode);
       }
       entries_iter = list_result.entries.begin();
index b1f682d56532a9a9e2e6832a54d48d4f9db53115..9dc35a553a576b9727e2ad5a74fb00d7005c15ce 100644 (file)
@@ -1181,6 +1181,8 @@ public:
         yield call(new RGWRadosGetOmapKeysCR(sync_env->store, pool, oid, marker, &entries, max_entries));
         if (retcode < 0) {
           ldout(sync_env->cct, 0) << "ERROR: " << __func__ << "(): RGWRadosGetOmapKeysCR() returned ret=" << retcode << dendl;
+          yield lease_cr->go_down();
+          drain_all();
           return retcode;
         }
         iter = entries.begin();
@@ -1193,10 +1195,6 @@ public:
             // fetch remote and write locally
             yield {
               RGWCoroutinesStack *stack = spawn(new RGWMetaSyncSingleEntryCR(sync_env, iter->first, iter->first, marker_tracker), false);
-              if (retcode < 0) {
-                return retcode;
-              }
-              assert(stack);
               stack->get();
 
               stack_to_pos[stack] = iter->first;