rgw源码走读-桶创建流程
Last updated on a year ago
rgw创建桶的流程 也是和其他请求一样,都是三部曲,主要流程在 RGWCreateBucket::execute() 里面,本次也是直接从这里出发(前面处理请求的大差不差,会有专门用一篇文章来介绍),这里组要介绍下bucket的概念,s3对桶的约束,以及解答以下几个问题?
- 创建桶的时候,桶的实例时持久化哪里?
- 那个池?是那个对象?有什么内容?桶id 的命名规则是?
创建桶后生成那些文件 ?
1 |
|
分别创建两个桶可以观察到,每次创建桶都会新增 meta 池中都会新增两个obj,在index新增一个obj,总结下 obj 命名规则
.bucket.meta.hrp:7fdb0063-3957-4eed-8d4e-c02b208c0d68.4192.1
- .bucket.meta.[bucket_name]:[桶id]
- 桶id 构成:[全局唯一的实例id].[num]
其中num在当前RGW实例中单调递增
hrp
- 桶名字
.dir.7fdb0063-3957-4eed-8d4e-c02b208c0d68.4192.1
- .dir.[bucket_name]:[桶id]
- 桶id 构成:[全局唯一的实例id].[num]
其中num在当前RGW实例中单调递增
这些obj作用是?
进入这函数分析下 RGWCreateBucket::execute
对于dir开头的obj,是对应每个bucket shard,在桶初始化时会在index吃 创建shard 数量的obj, bucket shard 的概念会在别的篇幅中介绍RGW Bucket ,
RGWCreateBucket::execute()
->RGWRados::create_bucket
->RGWRados::init_bucket_index
对应.bucket.meta 开头的obj ,存储了bucket instance, 看代码流程是 一些桶的关键信息 RGWBucketEntryPoint 结构体中, 然后在 meta池中写入这个oid中
RGWCreateBucket::execute()
->RGWRados::create_bucket
->put_linked_bucket_info
->RGWRados::put_bucket_instance_info
->rgw_bucket_instance_store_info // RGWBucketInfo 写入 obj
->store->meta_mgr->put_entry
->handler->get_pool_and_oid //构造 oid 名字 oid = RGW_BUCKET_INSTANCE_MD_PREFIX + key;
对应桶名字的obj
RGWCreateBucket::execute()
->RGWRados::create_bucket
->put_linked_bucket_info
->RGWRados::put_bucket_instance_info
->put_bucket_entrypoint_info // RGWBucketEntryPoint 写入 obj
->store->meta_mgr->put_entry
->handler->get_pool_and_oid //构造 oid 名字 oid = bukcet那么
这个两个 oid 都在同一个函数实现
1 |
|
- 这两个obj 有何不同?
.bucket.meta 开头对象记录很多 bucket 信息(写入了 结构体 RGWBucketInfo),而 bucket name 的对象只存放了简单bucket信息,保存桶名和桶实例id之间的映射, 两者是映射关系
可以用 radosgw-admin metadata 看到这obj的内容
1 |
|
TODO: 两个obj能否合并在一起? D版本之后是分开的,分开原因呢?