]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: fix radosgw-admin data sync run crash 15938/head
authorlu.shasha <lu.shasha@eisoo.com>
Tue, 27 Jun 2017 02:53:30 +0000 (10:53 +0800)
committerlu.shasha <lu.shasha@eisoo.com>
Tue, 27 Jun 2017 02:53:30 +0000 (10:53 +0800)
If sync thread have run before, then run data sync init. sync_status is still remain in rados pool. so no matter sync_status exists or not, if state is StateInit, sync_status.sync_info.num_shards should be updated.

Fixes: http://tracker.ceph.com/issues/20423
Signed-off-by: Shasha Lu <lu.shasha@eisoo.com>
src/rgw/rgw_data_sync.cc

index da4db761daa9719f585fdeffe9168bb445cbafed..a7cfd5c587366413eaf7817fd80d2be356efef8e 100644 (file)
@@ -1463,9 +1463,7 @@ public:
 
       data_sync_module = sync_env->sync_module->get_data_handler();
 
-      if (retcode == -ENOENT) {
-        sync_status.sync_info.num_shards = num_shards;
-      } else if (retcode < 0 && retcode != -ENOENT) {
+      if (retcode < 0 && retcode != -ENOENT) {
         ldout(sync_env->cct, 0) << "ERROR: failed to fetch sync status, retcode=" << retcode << dendl;
         return set_cr_error(retcode);
       }
@@ -1473,6 +1471,7 @@ public:
       /* state: init status */
       if ((rgw_data_sync_info::SyncState)sync_status.sync_info.state == rgw_data_sync_info::StateInit) {
         ldout(sync_env->cct, 20) << __func__ << "(): init" << dendl;
+        sync_status.sync_info.num_shards = num_shards;
         uint64_t instance_id;
         get_random_bytes((char *)&instance_id, sizeof(instance_id));
         yield call(new RGWInitDataSyncStatusCoroutine(sync_env, num_shards, instance_id, &sync_status));