RGW S3 Multipart解析

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的類關係圖

相關文章
相關標籤/搜索