美文网首页Ceph
Cephfs 的dir.layout属性的添加修改

Cephfs 的dir.layout属性的添加修改

作者: 落辰风雷 | 来源:发表于2018-08-23 22:02 被阅读3次

最近应组长的要求需要对ceph源码中关于cephfs模块的一组文件系统属性进行修改,在原来源码中写好的属性基础上再次添加一个属性,并且可以在命令行上进行getfattr 和setfattr操作。整个过程也称得上是身心俱疲,不过还好有每天晚上我家小可爱的亲切安慰才让躁动的内心平缓下来。

default的ceph.dir.layout如下:

  • 输入命令:getfattr -n ceph.dir.layout /nas/cephfs可以得到如下输出

    命令的解释为getfattr -n $cluster_name.dir.layout /nas/$cephfs_name

    getfattr: Removing leading '/' from absolute path names
    # file: nas/cephfs/
    ceph.dir.layout="stripe_unit=4194304 stripe_count=1 object_size=16777216 pool=data"
    

    这些属性从左到右分别代表:stripe_unit(cephfs分片之后每个单元的大小MB),stripe_count(分片的数量),object_size(底层存储时每个对象的大小),pool(数据资源池的名称)

  • 输入命令:getfattr -n ceph.dir.layout.stripe_count /nas/cephfs可以得到如下输出:

    getfattr: Removing leading '/' from absolute path names
    # file: nas/cephfs/
    ceph.dir.layout.stripe_count="1"
    
  • 输入命令:setfattr -n ceph.dir.layout.stripe_count -v 12 /nas/cephfs成功后没有输出,再次使用命令
    getfattr -n ceph.dir.layout.stripe_count /nas/cephfs可以得到如下输出:

    getfattr: Removing leading '/' from absolute path names
    # file: nas/cephfs/
    ceph.dir.layout.stripe_count="12"
    

添加我自己的属性完成如上操作:protect和follow_protect

分析:关于cephfs的client可以getfattr到该属性,并且在设备重新启动之后该属性仍然需要被get到,那么除了正常的client端代码需要对属性设置这一块做定义初始化,然后获取值显示之外还需要将该属性的数据进行固化存储到存储设备上,即osd的数据库。这个时候便需要mds server在创建文件系统之前将该属性存储下来,保证在client 端发出获取属性的requese之后能够从数据库中读出来。这个过程是ceph源码为了保证属性不被随意更改,所以在属性数据传输过程中会有加解密的过程。(图形表达更直观一点)

首先显示一下结果:

[root@node ceph]# getfattr -n ceph.dir.layout /nas/cephfs/
getfattr: Removing leading '/' from absolute path names
# file: nas/cephfs/
ceph.dir.layout="stripe_unit=4194304 stripe_count=12 object_size=4194304 protect=67 follow_protect=32 pool=cephfs_pool"

[root@node ceph]# getfattr -n ceph.dir.layout.protect /nas/cephfs/
getfattr: Removing leading '/' from absolute path names
# file: nas/cephfs/
ceph.dir.layout.protect="67"

[root@node ceph]# setfattr -n ceph.dir.layout.protect -v 20 /nas/cephfs/
[root@node ceph]# getfattr -n ceph.dir.layout.protect /nas/cephfs/
getfattr: Removing leading '/' from absolute path names
# file: nas/cephfs/
ceph.dir.layout.protect="20"

[root@node ceph]# 

更改代码ceph源码如下:

  • Getfattr:

    1. 定义:/ceph-12.2.1/src/common/fs_types.h(89):uint32_t protect;
    2. 初始化:/ceph-12.2.1/src/common/fs_types.h(97):protect(100)
    3. 设置默认值: /ceph-12.2.1/src/common/fs_types.h(103): static file_layout_t get_default() {return file_layout_t(1<<22, 1, 1<<22,1<<4,1<<5); }
    4. 界面获取全部属性:
      a) /ceph-12.2.1/src/common/client.cc(11246):protect=%lld
      b) /ceph-12.2.1/src/common/client.cc(11250): (unsigned long long)in->layout.protect;
      c) /ceph-12.2.1/src/common/client.cc(11374):XATTR_LAYOUT_FIELD(dir, layout, protect),
  • Setfattr

    1. 定义:
      a) /ceph-12.2.1/src/include/cephfs.h(536): __le32 protect;
      b) /ceph-12.2.1/src/include/cephfs.h(458):__le32 protect;
      c) /ceph-12.2.1/src/include/cephfs.h(44):__le32 fl_protect;
    2. 创建固化文件结构体并写入:
      a) /ceph-12.2.1/src/common/client.cc(8106): int Client::open()添加protect参数
      b) /ceph-12.2.1/src/common/client.cc(8161): _create() 补充创建参数protect
      c) /ceph-12.2.1/src/common/client.cc(11563):_create()添加创建函数的protect参数
      d) /ceph-12.2.1/src/common/client.cc(11648):将protect赋值给传入server请求的结构体变量req->head.args.open.protect = protect;

    细节的函数调用处理:
    调用open,_create的参数赋值
    client.cc(12512):
    _create(parent, name, flags, mode, in, fhp, 0, 0, 0,0,0, NULL, &created,perms);
    client.cc(8193):
    open(relpath, flags, perms, mode, 0, 0, 0,0,0, NULL);

    1. mds接受属性之前的编码:
      a) 字段赋值处理
      /ceph-12.2.1/src/common/fs_types.cc(15):f->dump_unsigned("protect",l.fl_protect);
      /ceph-12.2.1/src/common/fs_types.cc(141):f->dump_unsigned("protect",protect);
      b) 传给固化结构体/ceph-12.2.1/src/common/fs_types.cc(69): fl->fl_protect = protect;
      c) 编码存储(可以理解为加密存储) /ceph-12.2.1/src/common/fs_types.cc(110):::encode(protect, bl);
    2. MDS接受并处理:
      a) 对client传入过来layout的参数进行解析,取出固化的值赋值给结构体中的属性 /ceph-12.2.1/src/mds/server.cc(4407): else if (name == "layout.protect") layout->protect = boost::lexical_cast<unsigned>(value);
      b) 处理client的set layout /ceph-12.2.1/src/mds/server.cc(4228、4328):
      if (req->head.args.setlayout.layout.fl_protect > 0)
          layout.protect=req->head.args.setlayout.layout.fl_protect;
      
    3. client接受属性值并解码
      a) /ceph-12.2.1/src/common/fs_types.cc(54):protect = fl.fl_protect;
      b) /ceph-12.2.1/src/common/fs_types.cc(129):::decode(protect, p);

总结:

对于一些大型开源项目的源码的某一个模块的修改要建立在自己已经对该模块的功能有较为属性的了解(了解的程度是自己要能够看着源码将功能的实现流程从调用到功能操作结束顺一遍),过程最好用流程图表达出来,对于重要的函数也可以画一下函数流程图,数据调用流程图,这样在修改的时候才不会一头雾水,无从下手。

相关文章

  • Cephfs 的dir.layout属性的添加修改

    最近应组长的要求需要对ceph源码中关于cephfs模块的一组文件系统属性进行修改,在原来源码中写好的属性基础上再...

  • iOS RunTime 理解

    可以遍历对象的属性 可以动态的添加、修改属性,动态添加、修改、替换方法,动态添加、修改、替换协议 可以动态创建类、...

  • Vue动态修改属性同步渲染到页面

    给对象添加属性,修改属性 删除对象属性

  • runtime相关

    修改系统方法 动态添加方法 动态给系统类添加属性(给分类添加属性) runtime+kvc 转换模型

  • 16、jQuery 对属性的操作

    attr(): attr(属性名):获取属性 attr(属性名,属性值):修改或添加属性 removeAttr(属...

  • ArcMap简单使用

    添加属性表数据和修改数据 打开属性表,添加字段。 编辑器编辑编辑器编辑.png 点击选择区域-属性数据修改.png

  • 系统用户和用户组及权限管理

    1、添加用户 useradd 修改密码 passwd 2、添加组 groupadd 3、修改账户属性信息 user...

  • 动态修改字段信息

    修改字段类型、属性: 修改字段名称: 添加主键: 删除主键: 添加唯一: 删除唯一: 修改表名称:

  • Object defineProperty

    可向对象添加属性或修改属性 value enumerable configurable writable sett...

  • 代码修改Xib中的约束关系

    1 边距的修改可以通过拖拽的方式在代码中添加与xib约束对应的属性, 然后通过该属性的constant 属性修改偏...

网友评论

    本文标题:Cephfs 的dir.layout属性的添加修改

    本文链接:https://www.haomeiwen.com/subject/pntviftx.html