3.8 KiB
3.8 KiB
Phase 0 - RocksDB syscall 兼容矩阵
- 日期: 2026-03-02
- 采样对象:
/home/lian/env/rocksdb-test/db_bench - 当前 LD_PRELOAD:
/home/lian/share/10.1-spdk/zvfs/zvfs/libzvfs.so - 说明: 本矩阵基于 phase0 的
fillseq最小工作负载和失败分支采样;用于定义 phase2 必做 hook 范围。
1) 采样结论(关键)
1.1 成功基线(不启用 LD_PRELOAD,--db=/tmp/rdb_phase0_plain)
关键 syscall 计数(来自 strace 汇总):
| syscall | count |
|---|---|
| openat | 91 |
| fcntl | 82 |
| read | 56 |
| fstat | 56 |
| getdents64 | 36 |
| stat | 14 |
| mkdir | 12 |
| unlink | 12 |
| access | 11 |
| fsync | 10 |
| fdatasync | 10 |
| rename | 9 |
| pread64 | 8 |
| ftruncate | 5 |
| fallocate | 5 |
| lseek | 1 |
路径级(仅匹配 DB 路径)高频调用:
openat,mkdir,access,rename,unlink,rmdir
1.2 失败分支(启用 LD_PRELOAD,--db=/zvfs/rdb_phase0_preload)
观察到的关键失败:
- SPDK 初始化失败:
Cannot use IOVA as PA,随后spdk_env_init失败。 - RocksDB 目录创建路径使用
openat + mkdir,对/zvfs/rdb_phase0_preload返回ENOENT。 - 与 DB 路径相关错误码分布:
ENOENT x4。
结论:仅 hook open/read/write/close/unlink/lseek 无法支撑 RocksDB;至少要覆盖目录/元数据/同步/随机读写相关 syscall。
2) 当前实现 vs RocksDB 需求
当前已实现 hook(zvfs_hook.c):
open,read,write,close,unlink,lseek
当前缺失但在 phase0 中已观测到(或由 RocksDB 常规路径强依赖):
openat/openat64,mkdir,rmdirpread64/pwrite64(pwrite在 fillseq 未显式出现,但 RocksDB 通常依赖)fsync/fdatasyncftruncate/fallocatefcntl(文件锁)stat/fstat/lstat/newfstatat(含statx兼容策略)rename(CURRENT / OPTIONS / MANIFEST 原子更新)access/faccessat,unlinkat
3) Phase 2 必做清单(来自 phase0 证据)
这是“必须实现或必须可正确透传”的最小集合。
| API/syscall | 证据来源 | 当前状态 | Phase2 目标 |
|---|---|---|---|
| open/open64 | 现有 hook + RocksDB 文件创建 | 部分支持 | 补齐 flag 语义(O_TRUNC/O_APPEND/O_EXCL) |
| openat/openat2 | phase0 strace 高频 | 缺失 | 必须支持 /zvfs 路径 |
| close | 已实现 | 支持 | 保持并修复错误传播 |
| read/write | 已实现 | 支持 | 保持 |
| pread64/pwrite64 | phase0 观测到 pread64 | 缺失 | 必须支持 offset I/O |
| fsync/fdatasync | phase0 高频 | 缺失 | 必须支持(至少语义正确) |
| ftruncate | phase0 观测到 | 缺失 | 必须支持 |
| fallocate | phase0 观测到 | 缺失 | 必须支持或明确降级策略 |
| fcntl(F_SETLK等) | phase0 高频 | 缺失 | 必须支持最小锁语义 |
| stat/fstat/lstat/newfstatat | phase0 高频 | 缺失 | 必须支持最小元数据语义 |
| mkdir/rmdir | phase0 路径级高频 | 缺失 | 必须支持 /zvfs 目录层 |
| rename | phase0 路径级高频 | 缺失 | 必须支持原子替换语义 |
| unlink/unlinkat | unlink 已有,unlinkat 缺失 | 部分支持 | 补齐 unlinkat |
| access/faccessat | phase0 路径级高频 | 缺失 | 必须支持或一致透传 |
4) 可降级透传(phase2 可先不接管)
getdents64,readlink,statfs/fstatfs可先透传(前提:不作用于/zvfs或语义可接受)。- 若作用于
/zvfs路径,必须在 phase2 给出明确行为(支持或返回可解释错误)。
5) 风险与备注
- 当前机器环境下 SPDK 初始化存在 IOVA/PA 限制,影响“真实 I/O 路径”验证,需要在 phase1 前先明确运行环境策略。
- 仅凭
fillseq不能覆盖全部 syscall;phase2 开始前建议补readrandom/overwrite采样以确认pwrite64等调用比例。