【ceph】RGW/RadosGW框架/源碼分析


RadosGW分析

一、RadosGW的main()函數解析。

RadosGW的main()函數位於rgw_main.cc中,該函數是RadosGW的入口函數。這里主要解析和RadosGW相關的內容,盡量省略WebServer的內容。

main()函數解析如下:

1、根據g_conf->rgw_frontends得到默認支持的前端WebServers,目前默認支持的前端WebServer包括fastcgi和civetweb。對於每一個支持的前端都有一個RGWFrontendConfig類與之對應,最后將WebServer的名字和對應的RGWFrontendConfig類設置到fe_map集合中;

2、調用global_init()函數做初始化操作;

3、調用rgw_tool_init()函數從g_conf->rgw_mime_type_file指定的文件中讀取該文件中的數據並初始化;

4、調用curl_global_init()函數初始化libcurl,由此可以看出rgw使用curl進行網絡數據傳輸;

5、調用FCGX_Init()初始化WebServer;

6、調用RGWStoreManager::get_storage()函數初始化librados對象,即:以后對Ceph集群的操作都得通過該librados對象;

7、調用rgw_rest_init()初始化rest部分;

8、調用rgw_user_init()函數初始化radosgw中關於用戶部分的類RGWUserMetadataHandler,且將該類注冊到store->meta_mgr中;

9、調用rgw_buckt_init()函數初始化radosgw中關於bucket部分的類RGWBucketMetadataHandler和RGWBucketInstanceMetadataHandler,且將這兩個類注冊到store->meta_mgr中;

10、對於兼容S3的API來說,使用RGWRESTMgr_S3類作為radosgw中rest接口的默認處理類;

11、對於支持admin的操作來說,注冊管理員操作對應的類RGWRESTMgr_Usage/RGWRESTMgr_User/RGWRESTMgr_Bucket/RGWRESTMgr_Metadata/RGWRESTMgr_Log/RGWRESTMgr_Opstate/RGWRESTMgr_ReplicaLog/RGWRESTMgr_Config/RGWRESTMgr_Realm;

12、注冊信號處理函數,處理諸如SIGUP/SIGTERM等信號;

13、初始化前端WebServer並運行前端WebServer;

14、調用wait_shutdown()函數等待radosgw進程執行完畢;

實際的Web請求處理位於rgw_process.cc::process_request()函數內,該函數負責處理Web前端的數據讀寫請求。

 

二、process_request()函數分析流程

int process_request(RGWRados* store, RGWREST* rest, RGWRequest* req, RGWStreamIO* client_io, OpsLogSocket* olog)

參數說明:

store:在rgw_main.cc中的main()函數中調用的RGWStoreManager::get_storage()的返回值;

rest:在rgw_main.cc中的main()函數中調用rest.register_default_mgr(new RGWRESTMgr_S3())的返回值,也就是說rest是類RGWRESTMgr_S3的實例;

處理流程:

1)rest->get_handler():得到RGWHandler_REST類實例,包括:RGWHandler_REST_Service_S3/RGWHandler_REST_Bucket_S3/RGWHandler_REST_Obj_S3;

2)handler->get_op():根據request的op得到對應的操作處理類,如:GET/PUT/DELETE/POST等;

3)handler->authorize():執行認證操作。具體調用流程如下:

handler->authorize()

|__RGWHandler_REST_S3::authorize()

    |__RGW_Auth_S3::authorize()

|__RGW_Auth_S3::authorize_v4()/RGW_Auth_S3::authorize_v2()/

根據客戶端的請求頭中是否包含http_auth以及http_auth的內容,確定采用S3v4或S3v2進行認證;

4)handler->postauth_init():檢查bucket以及object名字的有效性。

handler->postauth_init()

|__rgw_parse_url_bucket() 解析出tenant名稱和bucket名稱

|__validate_tenant_name() 校驗tenant名稱的有效性

|__validate_s3_bucket_name() 校驗S3bucket名稱的有效性

|__validate_object_name() 校驗對象名稱的有效性

5)handler->init_permissions():讀取並創建bucket有效性檢查信息。

handler->init_permissions()

|__rgw_build_bucket_policies()

    |__初始化req_state->bucket_acl為RGWAccessControlPolicy_S3類實例

    |__RGWRados::get_bucket_info()/RGWRados::get_bucket_instance_info()獲取bucket info信息

    |__read_policy()讀取bucket的ACL信息,bucket的屬性信息等

    |__RGWRados::get_zonegroup()讀取bucket的zone信息

6)handler->retarget() 重新定位和計算存儲對象,這個對於某些website訪問的方式有效。

7)handler->read_permissions() 獲取bucket以及object的ACL信息

8)op->init_processing()

op->init_processing()

|__RGWOp::init_processing()

    |__RGWOp::init_quota()

|__獲取bucket_quota

|__獲取user_quota

9)op->verify_op_mask()

op->verify_op_mask()

|__RGWOp::verify_op_mask() 檢查操作的op_mask和用戶的op_mask是否一致

10)op->verify_permission()

op->verify_permission()

|__調用RGWOp子類對應的verify_permission()函數,由RGWOp子類自行判斷權限是否滿足

11)op->verify_params()

op->verify_params()

|__RGWPutObj_ObjStore::verify_params()/RGWPostObj_ObjStore::verify_params() 檢查上傳的數據大小是否超過g_conf->rgw_max_put_size值

12)op->pre_exec()

op->pre_exec()

|__調用RGWOp子類對應的pre_exec()函數,由RGWOp子類自行處理

13)op->execute()

op->execute()

|__調用RGWOp子類對應的execute()函數,由RGWOp子類自行處理

14)op->complete()

op->complete()

|__RGWOp::complete()

    |__調用RGWOp子類對應的send_response()函數,由RGWOp子類自行處理

 

因此在實際處理對象存儲請求時,需要RGWOp子類處理的主要函數包括:

1)RGWOp::verify_permission()

2)RGWOp::pre_exec()

3)RGWOp::execute()

4)RGWOp::send_response()

原文:https://my.oschina.net/linuxhunter/blog/654080

 

 

rgw bucket相關操作解析

https://www.e-learn.cn/topic/1473207

一、list bucket。

1、讀取bucket信息處理流程。

RGWListBucket::execute()

|__RGWRados::Bucket::List::list_objects()

    |__RGWRados::cls_bucket_list()

|__RGWRados::open_bucket_index()

|__CLSRGWIssueBucketList::issue_op()

    |__issue_bucket_list_op()

         |__librados::IoCtxImpl::aio_operate()op is rgw.bucket_list

              |__cls_rgw.cc::rgw_bucket_list()

        |__cls_rgw.cc::read_bucket_header()讀取struct rgw_bucket_dir的header信息

        |__cls_rgw.cc::get_obj_vals()讀取struct rgw_bucket_dir的entry信息

|__將讀取到的struct rgw_bucket_dir信息轉換成RGWObjEnt結構

    |__檢查讀取到的RGWObjEnt結構的合法性

 

實際保存到ceph集群中bucket信息的數據結構是struct rgw_bucket_dir,該結構內容如下:

Struct rgw_bucket_dir {

Struct rgw_bucket_dir_header header;保存bucket dir的頭部信息

std::map<string, struct rgw_bucket_dir_entry> m;保存bucket中文件或子bucket的名稱和entry的對應關系

};

2、讀取到的bucket信息返回給調用者。

RGWListBucket_ObjStore_S3::send_response()

拼接HTTP響應頭並且將讀取到的List信息RGWObjEnt放在Contents標簽內返回給調用者;

 

二、stat bucket。

1、讀取bucket stat信息處理流程。

RGWStatBucket::execute()

|__RGWRados::update_containers_stats()

    |__RGWRados::cls_bucket_head()

    |__遍歷讀取到的bucket head信息且從bucket head中更新count/size/size_rounded信息

2、讀取到的bucket stat信息返回給調用者。

RGWStatBucket_ObjStore_S3::send_response()

 

三、create bucket。

1、創建bucket的處理流程。

RGWCreateBucket::execute()

|__rgw_make_bucket_entry_name()創建bucket_entry_name=tenant_name + bucket_name

|__RGWRados::get_bucket_info()獲取指定用戶的bucket info信息

|__RGWRados::create_bucket()創建bucket

    |__RGWRados::select_bucket_placement()確定bucket.data_pool和bucket.index_pool名稱

    |__RGWRados::init_bucket_index()

|__CLSRGWIssueBucketIndexInit::issue_op()

    |__issue_bucket_index_init_op()

|__rgw_bucket_init_index()

    |__write_bucket_header()

|__cls_cxx_map_write_header()設置bucket的header信息

    |__RGWRados::put_linked_bucket_info()

|__RGWRados::put_bucket_instance_info()

    |__get_bucket_instance_entry()

    |__rgw_bucket_instance_store_info()更新bucket instance信息

|__RGWRados::put_bucket_entrypoint_info()

    |__rgw_make_bucket_entry_name()

    |__rgw_bucket_store_info()更新bucket metadata信息

|__rgw_link_bucket()創建bucket的鏈接

    |__rgw_get_bucket_obj()

    |__RGWRados::cls_user_add_bucket()

|__RGWRados::cls_user_update_buckets()

    |__cls_user_set_buckets()

|__cls_user.cc::cls_user_set_buckets_info()

    |__read_header()讀取bucket的header結構

    |__get_key_by_bucket_name()

    |__get_existing_bucket_entry()讀取bucket中指定的entry

    |__apply_entry_stats()更新entry的stats

    |__write_entry()重新寫bucket中指定的entry

    |__add_header_stats() 更新bucket的header的stat結構

    |__cls_cxx_map_write_header()更新bucket的header結構

    |__RGWRados::put_bucket_entrypoint_info()

|__rgw_make_bucket_entry_name()

|__rgw_bucket_store_info()更新bucket metadata

2、創建bucket的返回處理函數。

RGWCreateBucket_ObjStore_S3::send_response()

 

四、delete bucket。

1、刪除bucket的處理流程。

RGWDeleteBucket::execute()

|__rgw_bucket_sync_user_stats()

    |__rgw_get_buckets_obj()

    |__RGWRados::cls_user_sync_bucket_stats()

|__cls_bucket_head()讀取bucket的header信息

|__統計用戶所有buckets的stats信息並保存到cls_user_bucket_entry結構中

|__RGWRados::cls_user_update_buckets()

    |__cls_user_set_buckets()

    |__cls_user_set_buckets_info()更新bucket header和entry信息

|__RGWRados::delete_bucket()

    |__rgw_bucket_delete_bucket_obj()

|__librados::meta_mgr->remove_entry()刪除bucket metadata信息

    |__rgw_bucket_instance_remove_entry()

|__librados::meta_mgr->remove_entry()刪除bucket instance metadata信息

|__rgw_unlink_bucket()

    |__RGWRados::cls_user_remove_bucket()

|__cls_user_remove_bucket()

|__cls_user_remove_bucket()

    |__read_header()

    |__get_key_by_bucket_name()

    |__get_existing_bucket_entry()

    |__remove_entry()

|__cls_cxx_map_remove_key()

    |__RGWRados::get_bucket_entrypoint_info()

    |__RGWRados::put_bucket_entrypoint_info()

|__rgw_make_bucket_entry_name()

|__rgw_bucket_store_info()更新bucket metadata信息

2、刪除bucket的返回處理函數。

RGWDeleteBucket_ObjStore_S3::send_reponse()

 

五、bucket metadata。

1、RGWBucketMetadataHandler。

該類負責bucket metadata的get/put/delete操作。bucket metadata核心數據結構是struct RGWBucketEntryPoint。

Struct RGWBucketEntryPoint {

Rgw_bucket bucket;

Rgw_user owner;

Ceph::real_time creation_time;

Bool linked;

Bool has_bucket_info;

RGWBucketInfo old_bucket_info;

};

RGWBucketMetadataHandler類還負責遍歷bucket中所有對象名稱的方法:list_keys_init()/list_keys_next()/list_keys_complete()。其中bucket中所有對象名稱使用struct RGWObjEnt結構描述。

2、RGWBucketInstanceMetadataHandler。

該類負責bucket instance metadata的get/put/delete操作。在執行put操作更新bucket info時,首先獲取bucket location所在,之后根據得到的bucket location更新bucket info信息,最后調用RGWRados::init_bucket_index()函數來創建bucket的header信息。

RGWBucketMetadataHandler類還負責遍歷bucket中所有對象名稱的方法:list_keys_init()/list_keys_next()/list_keys_complete()。其中bucket中所有對象名稱使用struct RGWObjEnt結構描述。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM