From: Casey Bodley Date: Tue, 7 Jun 2016 19:50:18 +0000 (-0400) Subject: rgw: use RGWShardCollectCR for RGWReadDataSyncStatusCoroutine X-Git-Tag: v11.0.1~24^2~11 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=30823c5d4e98eb501ff1c2f7315705c3c5dd614d;p=ceph.git rgw: use RGWShardCollectCR for RGWReadDataSyncStatusCoroutine this allows us to limit the number of outstanding requests for shard markers there also appeared to be issues with spawning the shard CRs from RGWReadDataSyncStatusCoroutine::handle_data(), because handle_data() was returning before the shard CRs completed Signed-off-by: Casey Bodley --- diff --git a/src/rgw/rgw_data_sync.cc b/src/rgw/rgw_data_sync.cc index f22775b5d620..1d1f8bfcb34b 100644 --- a/src/rgw/rgw_data_sync.cc +++ b/src/rgw/rgw_data_sync.cc @@ -112,34 +112,76 @@ void rgw_datalog_shard_data::decode_json(JSONObj *obj) { JSONDecoder::decode_json("entries", entries, obj); }; -class RGWReadDataSyncStatusCoroutine : public RGWSimpleRadosReadCR { - RGWDataSyncEnv *sync_env; +class RGWReadDataSyncStatusMarkersCR : public RGWShardCollectCR { + static constexpr int MAX_CONCURRENT_SHARDS = 16; + + RGWDataSyncEnv *env; + const int num_shards; + int shard_id{0}; + map& markers; + + public: + RGWReadDataSyncStatusMarkersCR(RGWDataSyncEnv *env, int num_shards, + map& markers) + : RGWShardCollectCR(env->cct, MAX_CONCURRENT_SHARDS), + env(env), num_shards(num_shards), markers(markers) + {} + bool spawn_next() override; +}; + +bool RGWReadDataSyncStatusMarkersCR::spawn_next() +{ + if (shard_id >= num_shards) { + return false; + } + using CR = RGWSimpleRadosReadCR; + spawn(new CR(env->async_rados, env->store, env->store->get_zone_params().log_pool, + RGWDataSyncStatusManager::shard_obj_name(env->source_zone, shard_id), + &markers[shard_id]), + false); + shard_id++; + return true; +} +class RGWReadDataSyncStatusCoroutine : public RGWCoroutine { + RGWDataSyncEnv *sync_env; rgw_data_sync_status *sync_status; public: RGWReadDataSyncStatusCoroutine(RGWDataSyncEnv *_sync_env, - rgw_data_sync_status *_status) : RGWSimpleRadosReadCR(_sync_env->async_rados, _sync_env->store, - _sync_env->store->get_zone_params().log_pool, - RGWDataSyncStatusManager::sync_status_oid(_sync_env->source_zone), - &_status->sync_info), - sync_env(_sync_env), - sync_status(_status) {} - - int handle_data(rgw_data_sync_info& data); + rgw_data_sync_status *_status) + : RGWCoroutine(_sync_env->cct), sync_env(_sync_env), sync_status(_status) + {} + int operate() override; }; -int RGWReadDataSyncStatusCoroutine::handle_data(rgw_data_sync_info& data) +int RGWReadDataSyncStatusCoroutine::operate() { - if (retcode == -ENOENT) { - return retcode; - } - - map& markers = sync_status->sync_markers; - RGWRados *store = sync_env->store; - for (int i = 0; i < (int)data.num_shards; i++) { - spawn(new RGWSimpleRadosReadCR(sync_env->async_rados, store, store->get_zone_params().log_pool, - RGWDataSyncStatusManager::shard_obj_name(sync_env->source_zone, i), &markers[i]), true); + reenter(this) { + // read sync info + using ReadInfoCR = RGWSimpleRadosReadCR; + yield { + bool empty_on_enoent = false; // fail on ENOENT + call(new ReadInfoCR(sync_env->async_rados, sync_env->store, + sync_env->store->get_zone_params().log_pool, + RGWDataSyncStatusManager::sync_status_oid(sync_env->source_zone), + &sync_status->sync_info, empty_on_enoent)); + } + if (retcode < 0) { + ldout(sync_env->cct, 4) << "failed to read sync status info with " + << cpp_strerror(retcode) << dendl; + return set_cr_error(retcode); + } + // read shard markers + using ReadMarkersCR = RGWReadDataSyncStatusMarkersCR; + yield call(new ReadMarkersCR(sync_env, sync_status->sync_info.num_shards, + sync_status->sync_markers)); + if (retcode < 0) { + ldout(sync_env->cct, 4) << "failed to read sync status markers with " + << cpp_strerror(retcode) << dendl; + return set_cr_error(retcode); + } + return set_cr_done(); } return 0; }