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

98
plan/baseline_commands.md Normal file
View File

@@ -0,0 +1,98 @@
# Phase 0 - 基线命令与验证记录
- 日期: 2026-03-02
- 主机: `ubuntu`(本地开发机)
- db_bench 路径: `/home/lian/env/rocksdb-test/db_bench`
- LD_PRELOAD 库: `/home/lian/share/10.1-spdk/zvfs/zvfs/libzvfs.so`
## 1) 成功基线(不启用 LD_PRELOAD
### 命令
```bash
rm -rf /tmp/rdb_phase0_plain && \
strace -f -qq -o /tmp/phase0_plain.strace \
-e trace=%file,%desc,fsync,fdatasync,ftruncate,fallocate,pread64,pwrite64,lseek,rename,renameat,renameat2 \
/home/lian/env/rocksdb-test/db_bench \
--benchmarks=fillseq \
--db=/tmp/rdb_phase0_plain \
--num=5000 \
--value_size=128 \
--threads=1 \
--compression_type=none \
--stats_interval_seconds=0
```
### 结果摘要
- 命令退出码: `0`
- db_bench 输出: `fillseq ... 5000 operations`(成功)
- errno 分布trace 全局):
- `ENOENT x11`
- `EEXIST x9`
- 关键 syscall全局计数:
- `openat 91`, `fcntl 82`, `pread64 8`, `fsync 10`, `fdatasync 10`, `ftruncate 5`, `fallocate 5`, `rename 9`
- DB 路径相关 syscall`/tmp/rdb_phase0_plain`:
- `openat 61`, `mkdir 12`, `access 10`, `rename 9`, `unlink 12`, `rmdir 2`
## 2) 失败分支(启用 LD_PRELOAD/zvfs 路径)
### 命令
```bash
strace -f -qq -o /tmp/phase0_preload.strace \
-e trace=%file,%desc,fsync,fdatasync,ftruncate,fallocate,pread64,pwrite64,lseek,rename,renameat,renameat2 \
env LD_PRELOAD=/home/lian/share/10.1-spdk/zvfs/zvfs/libzvfs.so \
/home/lian/env/rocksdb-test/db_bench \
--benchmarks=fillseq \
--db=/zvfs/rdb_phase0_preload \
--num=1000 \
--value_size=128 \
--threads=1 \
--compression_type=none \
--stats_interval_seconds=0
```
### 结果摘要
- 命令退出码: `1`
- 关键报错:
- `Cannot use IOVA as 'PA'`
- `Failed to initialize DPDK`
- `open error: ... While mkdir if missing: /zvfs/rdb_phase0_preload: No such file or directory`
- `/zvfs/rdb_phase0_preload` 相关错误码:
- `ENOENT x4`
- 直接证据trace:
- `openat(..., "/zvfs/rdb_phase0_preload", ... O_DIRECTORY) = -1 ENOENT`
- `mkdir("/zvfs/rdb_phase0_preload", 0755) = -1 ENOENT`
## 3) 提取统计的复用命令
### 3.1 syscall 频次(全局)
```bash
sed -E 's/^\[pid +[0-9]+\] +//; s/^[0-9]+ +//' /tmp/phase0_plain.strace \
| grep -oP '^[a-zA-Z_][a-zA-Z0-9_]*(?=\()' \
| sort | uniq -c | sort -nr
```
### 3.2 errno 分布
```bash
grep -oP '= -1 [A-Z0-9]+' /tmp/phase0_plain.strace | awk '{print $3}' | sort | uniq -c | sort -nr
grep -oP '= -1 [A-Z0-9]+' /tmp/phase0_preload.strace | awk '{print $3}' | sort | uniq -c | sort -nr
```
### 3.3 DB 路径相关 syscall
```bash
grep '/tmp/rdb_phase0_plain' /tmp/phase0_plain.strace \
| sed -E 's/^\[pid +[0-9]+\] +//; s/^[0-9]+ +//' \
| grep -oP '^[a-zA-Z_][a-zA-Z0-9_]*(?=\()' \
| sort | uniq -c | sort -nr
```
## 4) Phase0 正确性验证清单(执行记录)
- [x] 每个“phase2 必须实现 syscall”都在矩阵中给出复现证据或来源。
- [x] 基线命令可重复执行(成功路径与失败路径各 1 组)。
- [x] 输出包含 syscall 统计与错误码分布。
- [x] 验证记录已写入 `plan/baseline_commands.md`
## 5) 已知限制phase1 前需处理)
1. 当前环境中 SPDK 初始化失败IOVA/PA导致无法在本机直接完成完整 `/zvfs` I/O 链路验证。
2. phase0 主要覆盖 `fillseq`phase1/phase2 开始前应补 `readrandom/overwrite` 的 syscall 采样。