88 lines
3.8 KiB
Markdown
88 lines
3.8 KiB
Markdown
# 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`, `rmdir`
|
||
- `pread64/pwrite64`(`pwrite` 在 fillseq 未显式出现,但 RocksDB 通常依赖)
|
||
- `fsync/fdatasync`
|
||
- `ftruncate/fallocate`
|
||
- `fcntl`(文件锁)
|
||
- `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) 风险与备注
|
||
|
||
1. 当前机器环境下 SPDK 初始化存在 IOVA/PA 限制,影响“真实 I/O 路径”验证,需要在 phase1 前先明确运行环境策略。
|
||
2. 仅凭 `fillseq` 不能覆盖全部 syscall;phase2 开始前建议补 `readrandom/overwrite` 采样以确认 `pwrite64` 等调用比例。
|