千家信息网

RGW S3 Multipart的示例分析

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍了RGW S3 Multipart的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。S3分段上传技术主要应用在大
千家信息网最后更新 2026年11月02日RGW S3 Multipart的示例分析

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

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的示例分析"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

对象 处理 函数 信息 属性 数据 集群 流程 篇文章 更新 实例 示例 分析 两个 参数 客户 客户端 文件 线程 价值 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 手冲咖啡和咖啡机区别 互联网科技工作委员会主任 厦门中拓互联网络科技有限公司 互联网最新的科技有限公司 广州互联网科技公司 腾讯科技 互联网女皇 壕鑫互联网络科技 恒生科技互联网指数分析 北京华百购互联网科技有限公司 受益于互联网科技的高速发展 江阴互联网智能科技产品进口 开一家科技互联网公司需要多少钱 链环科技传统企业怎么转型互联网 电子科技大学互联网创业大赛 玉溪新华互联网科技好不好 美国互联网科技实力 富国互联网金融科技混合基金 互联网高科技行业有哪些企业 陕西彩京云互联网科技有限公司 互联网高科技绘画 手磨咖啡 天津摩尔互联网科技 亿人帮互联网科技 互联网金融和金融科技 栖莱科技互联网股份有限公司 互联网科技扶贫时间 阿里互联网科技企业 南通创西澳互联网科技有限公司 江苏苏星互联网科技有限公司 平安好医生打造互联网科技医疗
0