From a4bf014b8642073f3eac226a93f6360cdd9cee25 Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Mon, 1 Aug 2016 15:21:52 -0400 Subject: [PATCH] rgw: use RGWShardCollectCR for RGWReadSyncStatusCoroutine Signed-off-by: Casey Bodley --- src/rgw/rgw_sync.cc | 83 +++++++++++++++++++++++++++++++++------------ 1 file changed, 61 insertions(+), 22 deletions(-) diff --git a/src/rgw/rgw_sync.cc b/src/rgw/rgw_sync.cc index 5bc8965d587f1..83c63bd1f82a3 100644 --- a/src/rgw/rgw_sync.cc +++ b/src/rgw/rgw_sync.cc @@ -693,36 +693,75 @@ public: } }; -class RGWReadSyncStatusCoroutine : public RGWSimpleRadosReadCR { - RGWMetaSyncEnv *sync_env; +class RGWReadSyncStatusMarkersCR : public RGWShardCollectCR { + static constexpr int MAX_CONCURRENT_SHARDS = 16; - rgw_meta_sync_status *sync_status; + RGWMetaSyncEnv *env; + const int num_shards; + int shard_id{0}; + map& markers; -public: - RGWReadSyncStatusCoroutine(RGWMetaSyncEnv *_sync_env, - rgw_meta_sync_status *_status) : RGWSimpleRadosReadCR(_sync_env->async_rados, _sync_env->store, - rgw_raw_obj(_sync_env->store->get_zone_params().log_pool, _sync_env->status_oid()), - &_status->sync_info), - sync_env(_sync_env), - sync_status(_status) { + public: + RGWReadSyncStatusMarkersCR(RGWMetaSyncEnv *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 RGWReadSyncStatusMarkersCR::spawn_next() +{ + if (shard_id >= num_shards) { + return false; } + using CR = RGWSimpleRadosReadCR; + rgw_raw_obj obj{env->store->get_zone_params().log_pool, + env->shard_obj_name(shard_id)}; + spawn(new CR(env->async_rados, env->store, obj, &markers[shard_id]), false); + shard_id++; + return true; +} + +class RGWReadSyncStatusCoroutine : public RGWCoroutine { + RGWMetaSyncEnv *sync_env; + rgw_meta_sync_status *sync_status; - int handle_data(rgw_meta_sync_info& data) override; +public: + RGWReadSyncStatusCoroutine(RGWMetaSyncEnv *_sync_env, + rgw_meta_sync_status *_status) + : RGWCoroutine(_sync_env->cct), sync_env(_sync_env), sync_status(_status) + {} + int operate() override; }; -int RGWReadSyncStatusCoroutine::handle_data(rgw_meta_sync_info& data) +int RGWReadSyncStatusCoroutine::operate() { - if (retcode == -ENOENT) { - return 0; - } - - RGWRados *store = sync_env->store; - map& markers = sync_status->sync_markers; - for (int i = 0; i < (int)data.num_shards; i++) { - spawn(new RGWSimpleRadosReadCR(sync_env->async_rados, store, - rgw_raw_obj(store->get_zone_params().log_pool, sync_env->shard_obj_name(i)), - &markers[i]), true); + reenter(this) { + // read sync info + using ReadInfoCR = RGWSimpleRadosReadCR; + yield { + bool empty_on_enoent = false; // fail on ENOENT + rgw_raw_obj obj{sync_env->store->get_zone_params().log_pool, + sync_env->status_oid()}; + call(new ReadInfoCR(sync_env->async_rados, sync_env->store, obj, + &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 = RGWReadSyncStatusMarkersCR; + 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; } -- 2.39.5