1. 程式人生 > >Ceph 基本資料結構(1)-object

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)