您好,登錄后才能下訂單哦!
這篇文章主要介紹了RGW S3 Multipart的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
S3分段上傳技術(shù)主要應(yīng)用在大文件的數(shù)據(jù)上傳上,通常在S3客戶端會對上傳的大文件做一次分片操作。在RGW內(nèi)部還會對S3客戶端發(fā)送過來的數(shù)據(jù)再進行一次分片處理,RGW默認(rèn)分片大小是4MB。
1、初始化Multipart。
初始化Multipart使用的是HTTP POST操作,在RGW中使用RGWInitMultipart_ObjStore_S3類處理。由于RGWInitMultipart_ObjStore_S3類繼承自RGWInitMultipart_ObjStore,而RGWInitMultipart_ObjStore類繼承自RGWInitMultipart,而RGWInitMultipart類繼承自RGWOp類。因此處理Mulipart初始化的操作主要集中在RGWInitMultipart::execute()函數(shù)中。下面對該函數(shù)的處理流程進行詳細(xì)解析。
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個隨機字母數(shù)字
|__以對象名稱和upload_id為參數(shù),初始化RGWMPObj對象
|__以bucket、RGWMPObj.meta以及RGWMPObj.ns為參數(shù),初始化rgw_obj對象
|__創(chuàng)建RGWRados::Object對象
|__創(chuàng)建RGWRados::Object::Write對象
|__RGWRados::Object::Write::write_meta()
|__創(chuàng)建ObjectWriteOperation對象
|__將屬性attrs的key/value寫入到ObjectWriteOperation對象
|__創(chuàng)建RGWRados::Bucket對象
|__創(chuàng)建RGWRados::Bucket::UpdateIndex對象
|__RGWRados::Bucket::UpdateIndex::prepare(CLS_RGW_OP_ADD) 準(zhǔn)備執(zhí)行更新object所在bucket的header信息以及dir_entry信息
|__RGWRados::cls_obj_prepare_op()
|__cls_rgw_bucket_prepare_op()
|__rgw_bucket_prepare_op()
|__read_key_entry()),對于不存在的entry則創(chuàng)建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() 執(zhí)行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則創(chuàng)建rgw_bucket_dir_entry類實例
|__cls_cxx_map_set_val() 將rgw_bucket_dir_entry寫入ceph集群
|__write_bucket_header() 將更新的rgw_bucket_dir_header信息寫入ceph集群
2、上傳Multipart數(shù)據(jù)。
上傳Multipart數(shù)據(jù)使用的是HTTP PUT操作,在RGW中使用RGWPutObj_ObjStore_S3類處理。由于RGWPutObj_ObjStore_S3類繼承自RGWPutObj_ObjStore,而RGWPutObj_ObjStore類繼承自RGWPutObj,而RGWPutObj類繼承自RGWOp類。因此處理Mulipart初始化的操作主要集中在RGWPutObj::execute()函數(shù)中。在該函數(shù)中處理Multipart部分的操作主要由RGWPutObjProcessor_Multipart類負(fù)責(zé)處理。在該類中有兩個主要的處理函數(shù)prepare()和do_complete()。下面分別解析這兩個函數(shù)的處理流程。
RGWPutObjProcessor_Multipart::prepare()
|__從HTTP請求流中得到uploadId和partNumber信息
|__設(shè)置manifest.prefix為oid+”.”+uploadId
|__RGWObjManifest::set_multipart_part_rule()
|__RGWObjManifest::generator::create_begin()
|__RGWObjManifest::get_implicit_location() 得到Multipart數(shù)據(jù)的命名及其位置
|__RGWObjManifest::update_iterators()
RGWPutObjProcessor_Multipart::do_complete()
|__創(chuàng)建RGWRados::Object對象
|__創(chuàng)建RGWRados::Object::Write對象
|__RGWRados::Object::Write::write_meta()
|__RGWRados::omap_set() 更新multipart_meta_obj對象的omap信息
3、完成Multipart數(shù)據(jù)上傳。
完成Multipart使用的是HTTP POST操作,在RGW中使用RGWCompleteMultipart_ObjStore_S3類處理。由于RGWCompleteMultipart_ObjStore_S3類繼承自RGWCompleteMultipart_ObjStore,而RGWCompleteMultipart_ObjStore類繼承自RGWCompleteMultipart,而RGWCompleteMultipart類繼承自RGWOp類。因此處理Mulipart完成的操作主要集中在RGWCompleteMultipart::execute()函數(shù)中。下面對該函數(shù)的處理流程進行詳細(xì)解析。
RGWCompleteMultipart::execute()
|__get_obj_attrs() 得到Multipart對象的屬性值
|__list_multipart_parts() 遍歷Multipart對象所有分片
|__解析所有分片且將分片的manifest信息寫入到Multipart對象的manifest列表中
|__創(chuàng)建RGWRados::Object對象
|__創(chuàng)建RGWRados::Object::Write對象
|__RGWRados::Object::Write::write_meta() 將屬性值寫入到Ceph集群
|__RGWRados::delete_obj() 刪除meta_obj對象(該對象負(fù)責(zé)保存分片上傳過程中的對象信息)
4、終止Multipart數(shù)據(jù)上傳。
終止Multipart使用的是HTTP DELETE操作,在RGW中使用RGWAbortMultipart_ObjStore_S3類處理。由于RGWAbortMultipart_ObjStore_S3類繼承自RGWAbortMultipart_ObjStore,而RGWAbortMultipart_ObjStore類繼承自RGWAbortMultipart,而RGWAbortMultipart類繼承自RGWOp類。因此處理Mulipart終止操作主要集中在RGWAbortMultipart::execute()函數(shù)中。下面對該函數(shù)的處理流程進行詳細(xì)解析。
RGWAbortMultipart::execute()
|__get_multipart_info() 得到meta_oid對象的屬性值
|__list_multipart_parts() 遍歷Multipart對象所有分片
|__RGWRados::update_gc_chain() 將已經(jīng)完成的Multipart分片放入到GC隊列中等待GC線程做回收操作
|__RGWRados::send_chain_to_gc() 啟動GC線程
|__創(chuàng)建RGWRados::Object對象
|__創(chuàng)建RGWRados::Object::Delete對象
|__RGWRados::Object::Delete::delete_obj() 刪除meta_oid對象
5、查看Multipart數(shù)據(jù)。
查看Multipart使用的是HTTP GET操作,在RGW中使用RGWListMultipart_ObjStore_S3類處理。由于RGWListMultipart_ObjStore_S3類繼承自RGWListMultipart_ObjStore,而RGWListMultipart_ObjStore類繼承自RGWListMultipart,而RGWListMultipart類繼承自RGWOp類。因此處理Mulipart終止操作主要集中在RGWListMultipart::execute()函數(shù)中。下面對該函數(shù)的處理流程進行詳細(xì)解析。
RGWListMultipart::execute()
|__get_multipart_info() 得到meta_oid對象的屬性值
|__list_multipart_parts() 遍歷Multipart對象所有分片
下面是RGW S3 Multipart的類關(guān)系圖
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“RGW S3 Multipart的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。