文档章节

rgw bucket相关操作解析

linuxhunter
 linuxhunter
发布于 2016/04/11 16:58
字数 763
阅读 3.3K
收藏 1

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

© 著作权归作者所有

linuxhunter
粉丝 74
博文 145
码字总数 93559
作品 0
沈阳
技术主管
私信 提问
加载中

评论(0)

RadosGW框架分析

RadosGW分析。 一、RadosGW的main()函数解析。 RadosGW的main()函数位于rgwmain.cc中,该函数是RadosGW的入口函数。这里主要解析和RadosGW相关的内容,尽量省略WebServer的内容。 main()函数...

linuxhunter
2016/04/07
928
1
RGW S3 Multipart解析

S3分段上传技术主要应用在大文件的数据上传上,通常在S3客户端会对上传的大文件做一次分片操作。在RGW内部还会对S3客户端发送过来的数据再进行一次分片处理,RGW默认分片大小是4MB。下面就M...

linuxhunter
2016/04/13
733
1
RGW S3 User解析

一、RGW S3 User使用的类关系图。 clsuserheader和clsuserbucketentry从用户角度看到用户所拥有的buckets信息,这两个对象(其中clsuserbucketentry以数组的形式出现)需要保存在ceph集群中。...

linuxhunter
2016/04/15
422
0
RGW Usage类解析

一、概述。 RGW Usage类实现了RGW的流量统计功能,其中包括发送/接收的字节数、执行操作的个数以及成功之行操作的个数。Usage类统计的这些内容对于一般的流量统计来说已经够用了。 二、核心...

linuxhunter
2016/04/19
302
0
ceph RGW接口源码解析--Rados数据操作

RGW业务处理流程: http reqest --> apache 转 FastCgi module FastCgi module --> radosgw 通过socket请求实现(未确定是否有其它方式) radosgw --> ceph集群 通过socket实现,调用rados接口......

惊浪
2014/12/11
3.4K
0

没有更多内容

加载失败,请刷新页面

加载更多

来,看我是如何把面试官问倒的!

来,看我是如何把面试官问倒的! # 反向面试 下面列表里的问题对于参加技术面试的人来说可能有些用。列表里的问题并不一定适用于某个特定的职位或者工作类型, 也没有排序 最开始的时候这只是...

osc_cqhvqcam
25分钟前
15
0
使用van-tabbar底部导航栏,会覆盖页面内容解决方法

移动端使用vant的时候,有时候会把导航栏放在页面底部,这个时候我在布局页面使用了van-tabbar组件,使用效果很好 但是页面比较长的时候,这个组件会覆盖掉一些页面的内容,这个时候,可以使...

osc_xsd7kks3
26分钟前
10
0
Python - 集合

# Author: Jason Zhu# Tool: PyCharm 2017# Python3.8 关于集合的使用方法# num = {1,2,3,3,6,2,77,8,2}# list改为set集合name1 = ['关羽','马超','关羽','马超','孙权']print(type......

osc_mf7xwvy6
28分钟前
20
0
java Arrays

数组变集合: 用于操作数组的工具类。 各种排序还能局部排序,相当nice。 asList:将数组变成list集合,可以使用集合的思想和方法来操作数组中的元素。 注意: 将数组变成集合后,不可以使用集...

osc_yevhupr2
29分钟前
11
0
Python中有许多HTTP客户端,但使用最广泛且最容易的是requests

前言 文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 作者:北京尚脑软件测试 PS:如有需要Python学习资料的小伙伴可...

osc_ufe2hk4l
30分钟前
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部