RadosGW框架分析

RadosGW分析。前端

1、RadosGW的main()函數解析。web

RadosGW的main()函數位於rgw_main.cc中,該函數是RadosGW的入口函數。這裏主要解析和RadosGW相關的內容,儘可能省略WebServer的內容。網絡

main()函數解析以下:frontend

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

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

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

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

五、調用FCGX_Init()初始化WebServer;url

六、調用RGWStoreManager::get_storage()函數初始化librados對象,即:之後對Ceph集羣的操做都得經過該librados對象;spa

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

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

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

十、對於兼容S3的API來講,使用RGWRESTMgr_S3類做爲radosgw中rest接口的默認處理類;

十一、對於支持admin的操做來講,註冊管理員操做對應的類RGWRESTMgr_Usage/RGWRESTMgr_User/RGWRESTMgr_Bucket/RGWRESTMgr_Metadata/RGWRESTMgr_Log/RGWRESTMgr_Opstate/RGWRESTMgr_ReplicaLog/RGWRESTMgr_Config/RGWRESTMgr_Realm;

十二、註冊信號處理函數,處理諸如SIGUP/SIGTERM等信號;

1三、初始化前端WebServer並運行前端WebServer;

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

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


2、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()

相關文章
相關標籤/搜索