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)