Files
zvfs/plan/rocksdb_syscall_matrix.md

3.8 KiB
Raw Blame History

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 需求

当前已实现 hookzvfs_hook.c

  • open, read, write, close, unlink, lseek

当前缺失但在 phase0 中已观测到(或由 RocksDB 常规路径强依赖):

  • openat/openat64, mkdir, rmdir
  • pread64/pwrite64pwrite 在 fillseq 未显式出现,但 RocksDB 通常依赖)
  • fsync/fdatasync
  • ftruncate/fallocate
  • fcntl(文件锁)
  • stat/fstat/lstat/newfstatat(含 statx 兼容策略)
  • renameCURRENT / 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 等调用比例。