【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结构描述。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值