S3分段上传技术主要应用在大文件的数据上传上,一般在S3客户端会对上传的大文件作一次分片操做。在RGW内部还会对S3客户端发送过来的数据再进行一次分片处理,RGW默认分片大小是4MB。下面就Multipart不一样部分进行详细解析。函数
一、初始化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_ACLip
|__rgw_get_request_metadata() 从HTTP请求中获得属性信息且这些属性信息的prefix key =user.rgw.ci
|__生成upload_id。upload_id = “2~” + 32个随机字母数字get
|__以对象名称和upload_id为参数,初始化RGWMPObj对象generator
|__以bucket、RGWMPObj.meta以及RGWMPObj.ns为参数,初始化rgw_obj对象it
|__建立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集群
二、上传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信息
三、完成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对象(该对象负责保存分片上传过程当中的对象信息)
四、终止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对象
五、查看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的类关系图