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的对外的接口。



你可能感兴趣的:(文件系统)