【glusterfs】EC落盘

 

 

  1. 客户端入口。FUSE 写请求进入 ,恢复后在  调下层 writev。如果你走的是 gfapi,这一层可以跳过,后面一样。

  2. EC 接管写。EC 的 fops 注册在 ,写入口是 ,真正实现从  开始。

  3. 先做条带对齐。EC 初始化参数里:
    fragments = nodes - redundancyfragment_size = 512stripe_size = fragment_size * fragments,代码在 
    对用户写入,EC 先在  里把 offset 向下按 stripe 对齐、size 向上补齐;对齐辅助函数在  和 

  4. 非整条带写是 RMW。head/tail 不齐时,EC 会在  里先补读旧条带头尾,再合并新数据:
    头部补读见 ,尾部补读见 
    所以 EC 的部分覆盖写,本质是客户端做一次 read-modify-write。

  5. 编码发生在客户端。数据准备好后,在  调  生成每个 brick 要写的 fragment。

  6. 每个 brick 落自己那一片。下发在 
    它把总编码缓冲区按 idx * size 切开,传给每个子卷;brick 侧写偏移是 fop->offset / ec->fragments,见 
    也就是说,逻辑文件的一条 stripe 会变成 n 片,分别写到 n 个 brick 上的同名文件里。

  7. RPC 传输的是“fragment + 写元信息”。客户端 RPC 头定义在 ;客户端封包在  和 ;服务端解包在 ,恢复后下发给 brick graph 的 

  8. 真正写盘在 posix。服务端最终到 ,里面调用 ,常规路径最终是 

posted @ 2026-04-23 10:22  苏格拉底的落泪  阅读(3)  评论(0)    收藏  举报