From 485ba081923ae5bba4492182a800aa99a0dc766c Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Thu, 23 Jan 2020 18:47:26 -0800 Subject: [PATCH] rgw: bucket sync: initiate bucket meta sync if can't find sync handler If bucket sync handler returns -ENOENT, try to get bucket info. This can trigger bucket meta sync. Signed-off-by: Yehuda Sadeh --- src/rgw/rgw_data_sync.cc | 98 ++++++++++++++++++++++++++++++++-------- 1 file changed, 79 insertions(+), 19 deletions(-) diff --git a/src/rgw/rgw_data_sync.cc b/src/rgw/rgw_data_sync.cc index 2ed80cd8791..a32eae25799 100644 --- a/src/rgw/rgw_data_sync.cc +++ b/src/rgw/rgw_data_sync.cc @@ -4121,7 +4121,6 @@ class RGWGetBucketPeersCR : public RGWCoroutine { rgw_sync_pipe_info_set::iterator siter; - rgw_bucket_get_sync_policy_params get_policy_params; std::shared_ptr source_policy; std::shared_ptr target_policy; @@ -4458,6 +4457,70 @@ void RGWGetBucketPeersCR::update_from_source_bucket_policy() } } + +class RGWSyncGetBucketSyncPolicyHandlerCR : public RGWCoroutine { + RGWDataSyncEnv *sync_env; + rgw_bucket bucket; + rgw_bucket_get_sync_policy_params get_policy_params; + + std::shared_ptr policy; + + RGWSyncTraceNodeRef tn; + + int i; + +public: + RGWSyncGetBucketSyncPolicyHandlerCR(RGWDataSyncEnv *_sync_env, + std::optional zone, + const rgw_bucket& _bucket, + std::shared_ptr& _policy, + const RGWSyncTraceNodeRef& _tn_parent) + : RGWCoroutine(_sync_env->cct), + sync_env(_sync_env), + bucket(_bucket), + policy(_policy), + tn(sync_env->sync_tracer->add_node(_tn_parent, "get_sync_policy_handler", + SSTR(bucket))) { + get_policy_params.zone = zone; + get_policy_params.bucket = bucket; + } + + int operate() override { + reenter(this) { + for (i = 0; i < 2; ++i) { + yield call(new RGWBucketGetSyncPolicyHandlerCR(sync_env->async_rados, + sync_env->store, + get_policy_params, + policy)); + if (retcode < 0 && + retcode != -ENOENT) { + return set_cr_error(retcode); + } + + if (retcode == 0) { + return set_cr_done(); + } + + /* bucket instance was not found, + * try to get bucket instance info, can trigger + * metadata sync of bucket instance + */ + yield call(new RGWSyncGetBucketInfoCR(sync_env, + bucket, + nullptr, + nullptr, + tn)); + if (retcode < 0) { + return set_cr_error(retcode); + } + } + } + + return 0; + } +}; + + int RGWGetBucketPeersCR::operate() { reenter(this) { @@ -4465,13 +4528,12 @@ int RGWGetBucketPeersCR::operate() pipes->clear(); } if (target_bucket) { - get_policy_params.zone = nullopt; - get_policy_params.bucket = *target_bucket; target_policy = make_shared(); - yield call(new RGWBucketGetSyncPolicyHandlerCR(sync_env->async_rados, - sync_env->store, - get_policy_params, - target_policy)); + yield call(new RGWSyncGetBucketSyncPolicyHandlerCR(sync_env, + nullopt, + *target_bucket, + target_policy, + tn)); if (retcode < 0 && retcode != -ENOENT) { return set_cr_error(retcode); @@ -4481,13 +4543,12 @@ int RGWGetBucketPeersCR::operate() } if (source_bucket && source_zone) { - get_policy_params.zone = source_zone; - get_policy_params.bucket = *source_bucket; source_policy = make_shared(); - yield call(new RGWBucketGetSyncPolicyHandlerCR(sync_env->async_rados, - sync_env->store, - get_policy_params, - source_policy)); + yield call(new RGWSyncGetBucketSyncPolicyHandlerCR(sync_env, + source_zone, + *source_bucket, + source_policy, + tn)); if (retcode < 0 && retcode != -ENOENT) { return set_cr_error(retcode); @@ -4521,13 +4582,12 @@ int RGWGetBucketPeersCR::operate() ++hiter) { ldpp_dout(sync_env->dpp, 20) << "Got sync hint for bucket=" << *source_bucket << ": " << hiter->get_key() << dendl; - get_policy_params.zone = nullopt; - get_policy_params.bucket = *hiter; target_policy = make_shared(); - yield call(new RGWBucketGetSyncPolicyHandlerCR(sync_env->async_rados, - sync_env->store, - get_policy_params, - target_policy)); + yield call(new RGWSyncGetBucketSyncPolicyHandlerCR(sync_env, + nullopt, + *hiter, + target_policy, + tn)); if (retcode < 0 && retcode != -ENOENT) { return set_cr_error(retcode); -- 2.39.5