RGW S3 Multipart的示例分析

55次阅读
没有评论

共计 4847 个字符,预计需要花费 13 分钟才能阅读完成。

这篇文章主要介绍了 RGW S3 Multipart 的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让丸趣 TV 小编带着大家一起了解一下。

S3 分段上传技术主要应用在大文件的数据上传上,通常在 S3 客户端会对上传的大文件做一次分片操作。在 RGW 内部还会对 S3 客户端发送过来的数据再进行一次分片处理,RGW 默认分片大小是 4MB。

1、初始化 Multipart。

      初始化 Multipart 使用的是 HTTP POST 操作,在 RGW 中使用 RGWInitMultipart_ObjStore_S3 类处理。由于 RGWInitMultipart_ObjStore_S3 类继承自 RGWInitMultipart_ObjStore,而 RGWInitMultipart_ObjStore 类继承自 RGWInitMultipart,而 RGWInitMultipart 类继承自 RGWOp 类。因此处理 Mulipart 初始化的操作主要集中在 RGWInitMultipart::execute() 函数中。下面对该函数的处理流程进行详细解析。

RGWInitMultipart::execute()

|__RGWInitMultipart_ObjStore_S3::get_params()     从 HTTP 请求中得到 RGWAccessControlPolicy_S3 类实例

|__将 RGWAccessControlPolicy_S3 放入到属性列表中且属性 key=RGW_ATTR_ACL

|__rgw_get_request_metadata()           从 HTTP 请求中得到属性信息且这些属性信息的 prefix key =user.rgw.

|__生成 upload_id。upload_id =“2~”+ 32 个随机字母数字

|__以对象名称和 upload_id 为参数,初始化 RGWMPObj 对象

|__以 bucket、RGWMPObj.meta 以及 RGWMPObj.ns 为参数,初始化 rgw_obj 对象

|__创建 RGWRados::Object 对象

|__创建 RGWRados::Object::Write 对象

|__RGWRados::Object::Write::write_meta()

     |__创建 ObjectWriteOperation 对象

     |__将属性 attrs 的 key/value 写入到 ObjectWriteOperation 对象

     |__创建 RGWRados::Bucket 对象

     |__创建 RGWRados::Bucket::UpdateIndex 对象

     |__RGWRados::Bucket::UpdateIndex::prepare(CLS_RGW_OP_ADD)     准备执行更新 object 所在 bucket 的 header 信息以及 dir_entry 信息

          |__RGWRados::cls_obj_prepare_op()

               |__cls_rgw_bucket_prepare_op()

                    |__rgw_bucket_prepare_op()

                         |__read_key_entry()),对于不存在的 entry 则创建 rgw_bucket_dir_entry 类实例

                         |__read_bucket_header()           读取 rgw_bucket_dir_header

                         |__cls_cxx_map_set_val()           将 rgw_bucket_dir_entry 写入 ceph 集群

                         |__write_bucket_header()           将更新的 rgw_bucket_dir_header 信息写入 ceph 集群

     |__RGWRados::IoCtx::operate()           执行 object 的 attrs 写入 ceph 集群的操作

     |__RGWRados::Bucket::UpdateIndex::complete()          

          |__RGWRados::cls_obj_complete_add()

               |__RGWRados::cls_obj_complete_op()

                    |__cls_rgw_bucket_complete_op()

                         |__rgw_bucket_complete_op()

                              |__read_bucket_header()     读取 rgw_bucket_dir_header

                              |__read_key_entry(),对于不存在的 entry 则创建 rgw_bucket_dir_entry 类实例

                              |__cls_cxx_map_set_val()     将 rgw_bucket_dir_entry 写入 ceph 集群

                              |__write_bucket_header()     将更新的 rgw_bucket_dir_header 信息写入 ceph 集群

2、上传 Multipart 数据。

      上传 Multipart 数据使用的是 HTTP PUT 操作,在 RGW 中使用 RGWPutObj_ObjStore_S3 类处理。由于 RGWPutObj_ObjStore_S3 类继承自 RGWPutObj_ObjStore,而 RGWPutObj_ObjStore 类继承自 RGWPutObj,而 RGWPutObj 类继承自 RGWOp 类。因此处理 Mulipart 初始化的操作主要集中在 RGWPutObj::execute() 函数中。在该函数中处理 Multipart 部分的操作主要由 RGWPutObjProcessor_Multipart 类负责处理。在该类中有两个主要的处理函数 prepare() 和 do_complete()。下面分别解析这两个函数的处理流程。

RGWPutObjProcessor_Multipart::prepare()

|__从 HTTP 请求流中得到 uploadId 和 partNumber 信息

|__设置 manifest.prefix 为 oid+”.”+uploadId

|__RGWObjManifest::set_multipart_part_rule()

|__RGWObjManifest::generator::create_begin()

     |__RGWObjManifest::get_implicit_location()     得到 Multipart 数据的命名及其位置

     |__RGWObjManifest::update_iterators()

RGWPutObjProcessor_Multipart::do_complete()

|__创建 RGWRados::Object 对象

|__创建 RGWRados::Object::Write 对象

|__RGWRados::Object::Write::write_meta()

|__RGWRados::omap_set()               更新 multipart_meta_obj 对象的 omap 信息

3、完成 Multipart 数据上传。

      完成 Multipart 使用的是 HTTP POST 操作,在 RGW 中使用 RGWCompleteMultipart_ObjStore_S3 类处理。由于 RGWCompleteMultipart_ObjStore_S3 类继承自 RGWCompleteMultipart_ObjStore,而 RGWCompleteMultipart_ObjStore 类继承自 RGWCompleteMultipart,而 RGWCompleteMultipart 类继承自 RGWOp 类。因此处理 Mulipart 完成的操作主要集中在 RGWCompleteMultipart::execute() 函数中。下面对该函数的处理流程进行详细解析。

RGWCompleteMultipart::execute()

|__get_obj_attrs()                     得到 Multipart 对象的属性值

|__list_multipart_parts()           遍历 Multipart 对象所有分片

|__解析所有分片且将分片的 manifest 信息写入到 Multipart 对象的 manifest 列表中

|__创建 RGWRados::Object 对象

|__创建 RGWRados::Object::Write 对象

|__RGWRados::Object::Write::write_meta()           将属性值写入到 Ceph 集群

|__RGWRados::delete_obj()                     删除 meta_obj 对象(该对象负责保存分片上传过程中的对象信息)

4、终止 Multipart 数据上传。

      终止 Multipart 使用的是 HTTP DELETE 操作,在 RGW 中使用 RGWAbortMultipart_ObjStore_S3 类处理。由于 RGWAbortMultipart_ObjStore_S3 类继承自 RGWAbortMultipart_ObjStore,而 RGWAbortMultipart_ObjStore 类继承自 RGWAbortMultipart,而 RGWAbortMultipart 类继承自 RGWOp 类。因此处理 Mulipart 终止操作主要集中在 RGWAbortMultipart::execute() 函数中。下面对该函数的处理流程进行详细解析。

RGWAbortMultipart::execute()

|__get_multipart_info()                           得到 meta_oid 对象的属性值

|__list_multipart_parts()                         遍历 Multipart 对象所有分片

|__RGWRados::update_gc_chain()           将已经完成的 Multipart 分片放入到 GC 队列中等待 GC 线程做回收操作

|__RGWRados::send_chain_to_gc()           启动 GC 线程

|__创建 RGWRados::Object 对象

|__创建 RGWRados::Object::Delete 对象

|__RGWRados::Object::Delete::delete_obj()     删除 meta_oid 对象

5、查看 Multipart 数据。

      查看 Multipart 使用的是 HTTP GET 操作,在 RGW 中使用 RGWListMultipart_ObjStore_S3 类处理。由于 RGWListMultipart_ObjStore_S3 类继承自 RGWListMultipart_ObjStore,而 RGWListMultipart_ObjStore 类继承自 RGWListMultipart,而 RGWListMultipart 类继承自 RGWOp 类。因此处理 Mulipart 终止操作主要集中在 RGWListMultipart::execute() 函数中。下面对该函数的处理流程进行详细解析。

RGWListMultipart::execute()

|__get_multipart_info()                               得到 meta_oid 对象的属性值

|__list_multipart_parts()                         遍历 Multipart 对象所有分片

下面是 RGW S3 Multipart 的类关系图

感谢你能够认真阅读完这篇文章,希望丸趣 TV 小编分享的“RGW S3 Multipart 的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持丸趣 TV,关注丸趣 TV 行业资讯频道,更多相关知识等着你来学习!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计4847字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)