0%

基于pmem的快速访问

  • 基于pmem的块速访问机制

问题提出

  • cephfs的MDCache中的path_traverse函数调用需要对绝对路径名进行分级解析
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    int path_traverse(MDRequestRef& mdr, MDSContextFactory& cf,
    const filepath& path, int flags,
    std::vector<CDentry*> *pdnvec, CInode **pin=nullptr);

    # flag解析部分

    bool discover = (flags & MDS_TRAVERSE_DISCOVER);
    bool forward = !discover;
    bool path_locked = (flags & MDS_TRAVERSE_PATH_LOCKED);
    bool want_dentry = (flags & MDS_TRAVERSE_WANT_DENTRY);
    bool want_auth = (flags & MDS_TRAVERSE_WANT_AUTH);
    bool rdlock_snap = (flags & (MDS_TRAVERSE_RDLOCK_SNAP | MDS_TRAVERSE_RDLOCK_SNAP2));
    bool rdlock_path = (flags & MDS_TRAVERSE_RDLOCK_PATH);
    bool xlock_dentry = (flags & MDS_TRAVERSE_XLOCK_DENTRY);
    bool rdlock_authlock = (flags & MDS_TRAVERSE_RDLOCK_AUTHLOCK);
    • 参数介绍:
      1. mdr参数:元数据请求指令,可以为空值
      2. 用来构建waiter的MDSContext工厂模式
      3. path:当前函数需要请求访问的路径名
      4. flags:用来区分不同的查找模式
        • 默认情况下,path_traverse最先会向主MDS节点发送请求
        • MDS_TRAVERSE_DISCOVER参数:用来判断是否是在非主MDS上寻找对应的路径文件,最终会把找到的信息返回主节点并更新主节点的cache
        • MDS_TRAVERSE_PATH_LOCKED参数:path
        • MDS_TRAVERSE_WANT_DENTRY参数:调用者希望获取一个尾部dentry
        • MDS_TRAVERSE_WANT_AUTH:永远只把请求发给目标inode的主MDS或者尾部dentry的主MDS
    • 笔者的思路,这样反复进行函数调用消耗了大量的时间在函数开销以及网络通信中,如何借助pmem来针对这个函数进行加速?
      • 首先,我们打算把元数据放在pmem中进行存储,存储的数据形式是k-v数据库的形式。
      • 为了避免一层一层目录访问的方式,我打算在pmem中建立一个新的索引结构,帮助元数据服务器快速在数据库中定位到需要的inode信息。具体的实现架构如下: