RGWS3Multipart的示例分析

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

10年专注成都网站制作,成都企业网站建设,个人网站制作服务,为大家分享网站制作知识、方案,网站设计流程、步骤,成功服务上千家企业。为您提供网站建设,网站制作,网页设计及定制高端网站建设服务,专注于成都企业网站建设,高端网页制作,对成都阳光房等多个方面,拥有多年的网站制作经验。

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的类关系图

RGW S3 Multipart的示例分析

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


分享题目:RGWS3Multipart的示例分析
标题网址:http://azwzsj.com/article/iesohd.html