Ceph 基本数据结构(1)-object

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值