1. 程式人生 > >Ceph 原始碼分析 -OS module

Ceph 原始碼分析 -OS module

Ceph的src/os 中儲存了 ObjectStore程式碼實現。 基本概念 物件 物件儲存的概念,把物件作為儲存的實體。 在Ceph 檔案系統裡,物件的名稱空間分了兩層, 第一層是Collection的概念,一個Collection就是許多Object的集合,相當於其他物件儲存的group的概念,用coll_t來標識。  ObjectStore 類 就代表了一個Object, 其繼承關係為 FileStore 繼承了 JournalingObjectStore,JournalingObjectStore繼承了ObjectStore 事務 Transaction類代表了一個事務操作。所有的操作都必須通過一個transaction來執行。 一個transaction幾乎實現了所有對物件和集合的操作。 ObjectMap的概念 ObjectMap, 就是一些key,value的map屬性,其儲存在Object裡面。 在Ceph檔案系統了,ObjectMap由levelDB這個google開源的KV資料庫來實現。 還有一個attributes的 概念,attributes也是一些 key/value的屬性值。 首先看一下對外的介面,我們可以通過src/test/filestore/store_test.cc檔案來看一下其實如何執行的:
virtual void SetUp() {
    ::mkdir("store_test_temp_dir", 0777);
    ObjectStore *store_ = new FileStore(string("store_test_temp_dir"), string("store_test_temp_journal"));
    store.reset(store_);
    store->mkfs();
    store->mount();
  }
首先mkdir一個目錄,store_test_temp_dir,  新建一個FileStore物件,其後面的引數分別是:檔案的目錄和日誌的目錄,分別也可以是一個block device.  呼叫mkfs 函式和 mount 函式,後面會詳細介紹。
    ObjectStore::Transaction t;
    t.create_collection(cid);
    cerr << "create collection" << std::endl;
    r = store->apply_transaction(t);
    ASSERT_EQ(r, 0);
這是一個建立collection的程式碼 先通過一個transaction 來建立,之後通過 store 的 apply_transaction 函式來應用日誌,來完成建立一個collection。
 hobject_t hoid(sobject_t("Object 1", CEPH_NOSNAP));
  {
    ObjectStore::Transaction t;
    t.touch(cid, hoid);
    cerr << "Creating object " << hoid << std::endl;
    r = store->apply_transaction(t);
    ASSERT_EQ(r, 0);
  }
同樣的,可以通過transaction的介面touch來在一個collection 中建立一個物件。
在store_test.cc測試檔案中,還有其它的測試操作其包括:
  • 建立/刪除一個collection
  • 建立/刪除一個collection 的 object
  • omap的set/get , 這裡 omap也許不容易理解,就是key/value 的map隊儲存在object 中,所以叫omap
  • 屬性的set/get
  • 其它collection的操作,這裡就不詳述。
總之,通過store_test.cc的測試檔案,可以清晰的瞭解Object的對外的介面。