zvfs: hook db_bench thread 1 complete

This commit is contained in:
2026-03-02 14:45:24 +00:00
parent 321212826b
commit c33a694bd8
12 changed files with 3349 additions and 794 deletions

View File

@@ -0,0 +1,87 @@
# 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` 不能覆盖全部 syscallphase2 开始前建议补 `readrandom/overwrite` 采样以确认 `pwrite64` 等调用比例。