概述
Ceph的基本的概念就是对象object,在ceph的rados概念中,一个对象就是一个文件系统中的文件,具体在代码实现中,有object, sobject, hobject, ghobject等概念,在阅读ceph 的源代码时,上述几个概念有时候容易理不清。
struct object_t {
string name;
......
}
object_t 就是对于的低层文件系统的一个文件,name就对于的文件名
struct sobject_t {
object_t oid;
snapid_t snap;
......
}
sobject_t 就是 加了snapshot相关信息的object_t ,snap 就是该对象对于的snapshot的以snap 号,
这个主要用于快照。如果一个对象不是快照,那么这个对象的snap 字段就设置为CEPH_NOSNAP,非snapshot对象,ceph称之为该对象对于的 head对象
struct hobject_t {
object_t oid;
snapid_t snap;
private:
uint32_t hash;
bool max;
uint32_t nibblewise_key_cache;
uint32_t hash_reverse_bits;
static const int64_t POOL_META = -1;
static const int64_t POOL_TEMP_START = -2; // and then negative
friend class spg_t; // for POOL_TEMP_START
public:
int64_t pool;
string nspace;
private:
string key;
......
}
hobject_t 是名字应该是 hash object的缩写。
其除了已经介绍过的数据成员:
object_t oid; 保存对象的名字
snapid_t snap; 保存对象的snap号
新增加了成员:
int64_t pool 所在的pool的id
string nspace
string key
string hash
nspace一般为空,hash和key 不能同时设置,hash就是pg的id
struct ghobject_t {
hobject_t hobj;
gen_t generation;
shard_id_t shard_id;
bool max;
public:
static const gen_t NO_GEN = UINT64_MAX;
......
}
ghobject 在对象hobject_t的基础上,添加了 generation字段 和 shard_id 字段
这个主要用于ErasureCode 用于rollback用的。如果是Replicate,那么shard_id字段就设置为NO_SHARD(-1),这两个字段对于replicate是没有用的。
当PG为EC时,写操作需要区分写前后两个版本的object. 写操作保存对象的上一个版本(generation)的对象,当EC写失败时,可以恢复到上一个版本
rados对象的名字:
name+[“head”|”snapdir”|snap] + “_” + hash(十六进制)+ “_” +pool_id + [“_” + generaion +”_” + shard_id]
具体的代码实现在函数如下,大家有兴趣可以自己研究一下
string LFNIndex::lfn_generate_object_name(const ghobject_t &oid)
最后
以上就是如意小甜瓜为你收集整理的Ceph 基本数据结构(1)-object的全部内容,希望文章能够帮你解决Ceph 基本数据结构(1)-object所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复