DESIGN
This commit is contained in:
@@ -5,7 +5,7 @@
|
||||
## 这一步做了什么
|
||||
|
||||
- 一个基于 **libfuse3** 的 C++ FUSE Daemon(`etvd_fuse`),挂载一个目录,拦截全部文件系统调用。
|
||||
- **透传后端(passthrough)**:所有操作转发到真实后端目录(默认 `./backend`)。这是第一阶段的后端;第二阶段会替换为 COW append-only 后端(`data.raw` + Segment + `cur` 快照),FUSE 拦截层与日志层保持不变。
|
||||
- **透传后端(passthrough)**:所有操作转发到真实后端目录(默认 `./backend`)。这是第一阶段的后端;第二阶段会替换为 COW append-only 后端(`data.raw` + Segment),第三阶段再引入 `cur` 快照加速读,FUSE 拦截层与日志层保持不变。
|
||||
- **操作日志层**:每一次拦截到的调用都结构化打印到 stderr(`[etvd] <op> <path> <detail>`),`write` 额外带 `off/size/rc` 与前 16 字节 hex 预览 —— 满足「从底层观察到每一次写入」。
|
||||
- 回调里直接 log + syscall 透传,**没有额外抽象层**(FUSE3 自己的 `struct fuse_operations` 就是接口)。第二阶段做 COW 后端时再按需引入存储抽象 —— 届时 `write` 语义是 append+Segment,和现在的 pwrite 形状不同,现在猜接口多半对不上。
|
||||
|
||||
@@ -105,7 +105,7 @@ fusermount3 -u mnt
|
||||
|
||||
- **绝对路径**:libfuse3 在跑事件循环前会 `chdir("/")`,因此 daemon 在请求时解析的所有路径(后端根目录)必须是绝对路径。`main` 在挂载前把 `backend` 与 `mountpoint` 都 `realpath` 成绝对路径。
|
||||
- **文件句柄**:`open/create` 打开真实 fd 存入 `fuse_file_info->fh`;`read/write` 用 `pread/pwrite`;`release` 关闭。
|
||||
- **锁**:`lock` 回调对 `F_GETLK` 返回 `F_UNLCK`、对 `F_SETLK` 返回 0,使 SQLite 的 fcntl 建议锁在单进程下正常运行。**真实互斥留到第十阶段的分布式写租约。**
|
||||
- **锁**:`lock` 回调对 `F_GETLK` 返回 `F_UNLCK`、对 `F_SETLK` 返回 0,使 SQLite 的 fcntl 建议锁在单进程下正常运行。**真实互斥留到第十一阶段的分布式写租约。**
|
||||
- **未实现的 op**(xattr / fallocate 等)保持 NULL,FUSE 返回 `-ENOSYS`,SQLite 等会自动回退。
|
||||
|
||||
## 第一阶段边界(明确不做)
|
||||
|
||||
Reference in New Issue
Block a user