From 48da099d9db4159b8155d5367c45ff8e8128e916 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Wed, 18 Oct 2017 17:41:00 -0700 Subject: [PATCH] rgw: aws sync, initial work on multipart data parts creation Signed-off-by: Yehuda Sadeh --- src/rgw/rgw_sync_module_aws.cc | 51 ++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/src/rgw/rgw_sync_module_aws.cc b/src/rgw/rgw_sync_module_aws.cc index 571947d99f5..94ce689f99d 100644 --- a/src/rgw/rgw_sync_module_aws.cc +++ b/src/rgw/rgw_sync_module_aws.cc @@ -401,6 +401,19 @@ class RGWAWSStreamObjToCloudMultipartCR : public RGWCoroutine { string upload_id; + uint32_t part_size; + int num_parts; + + struct part_info { + int part_num; + uint64_t ofs; + uint64_t size; + string etag; + }; + + int cur_part{0}; + uint64_t cur_ofs{0}; + public: RGWAWSStreamObjToCloudMultipartCR(RGWDataSyncEnv *_sync_env, RGWRESTConn *_source_conn, @@ -415,27 +428,37 @@ public: src_obj(_src_obj), dest_obj(_dest_obj), obj_size(_obj_size), - mtime(_mtime) {} + mtime(_mtime) { +#warning flexible part size needed + part_size = 5 * 1024 * 1024; - int operate() { - reenter(this) { -#if 0 - /* init input */ - in_crf.reset(new RGWRESTStreamGetCRF(cct, get_env(), this, sync_env, source_conn, src_obj)); + num_parts = (obj_size + part_size - 1) / part_size; + } - /* init output */ - out_crf.reset(new RGWAWSStreamPutCRF(cct, get_env(), this, sync_env, dest_conn, - dest_obj)); - yield call(new RGWStreamSpliceCR(cct, sync_env->http_manager, in_crf, out_crf)); + int operate() { + reenter(this) { + yield call(new RGWAWSInitMultipartCR(sync_env, dest_conn, dest_obj, obj_size, mtime, &upload_id)); if (retcode < 0) { return set_cr_error(retcode); } -#endif - yield call(new RGWAWSInitMultipartCR(sync_env, dest_conn, dest_obj, obj_size, mtime, &upload_id)); - if (retcode < 0) { - return set_cr_error(retcode); + for (cur_part = 1; cur_part <= num_parts; ++cur_part) { + yield { + part_info cur_part_info; + cur_part_info.part_num = cur_part + 1; + cur_part_info.ofs = cur_ofs; + cur_part_info.size = std::min((uint64_t)part_size, obj_size - cur_ofs); + + cur_ofs += part_size; + + call(new RGWAWSStreamObjToCloudMultipartPartCR(sync_env, + source_conn, src_obj, + dest_conn, dest_obj, + upload_id, + cur_part_info.ofs, cur_part_info.size, + cur_part_info.part_num)); + } } return set_cr_done(); -- 2.39.5