4.2 KiB
4.2 KiB
Phase 1 验证方案(用户执行)
背景:本轮已完成 phase1 代码改造,但当前代理环境无法在 root + SPDK 运行条件下完成端到端验证。下面步骤请你在本机执行。
0) 目标
验证 3 件事:
zvfs_io_req解耦后,read/write旧路径行为不回退。- 新增
zvfs_pread/zvfs_pwriteAPI 能正确处理 offset I/O。 - 构建产物
libzvfs.so可正常编译链接。
1) 构建验证
cd /home/lian/share/10.1-spdk/zvfs
make -C zvfs -j
期望:
- 编译成功,无报错。
- 生成
/home/lian/share/10.1-spdk/zvfs/zvfs/libzvfs.so。
2) Phase1 新 API 验证(不依赖 LD_PRELOAD hook)
2.1 生成临时测试程序
cat >/tmp/phase1_api_check.c <<'EOF'
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "zvfs.h"
static int expect_eq(const char *name, const void *got, const void *exp, size_t n) {
if (memcmp(got, exp, n) != 0) {
fprintf(stderr, "[FAIL] %s mismatch\n", name);
return -1;
}
printf("[OK] %s\n", name);
return 0;
}
int main(void) {
int rc = 1;
int mounted = 0;
int created = 0;
if (zvfs_env_setup() != 0) {
fprintf(stderr, "zvfs_env_setup failed\n");
return rc;
}
zvfs_t *fs = calloc(1, sizeof(*fs));
zvfs_file_t *file = calloc(1, sizeof(*file));
zvfs_dirent_t *dirent = calloc(1, sizeof(*dirent));
if (!fs || !file || !dirent) {
rc = 2;
goto out;
}
if (!zvfs_mount(fs)) {
fprintf(stderr, "zvfs_mount failed\n");
rc = 3;
goto out;
}
mounted = 1;
file->fs = fs;
file->dirent = dirent;
if (!zvfs_create(file)) {
fprintf(stderr, "zvfs_create failed\n");
rc = 4;
goto out;
}
created = 1;
/* 验证 pwrite + pread 的 offset 语义 */
const char *a = "AAAA";
const char *b = "BBBB";
if (zvfs_pwrite(file, (const uint8_t *)a, 4, 0) != 4) { rc = 5; goto out; }
if (zvfs_pwrite(file, (const uint8_t *)b, 4, 8) != 4) { rc = 6; goto out; }
uint8_t got[12] = {0};
uint8_t exp[12] = {'A','A','A','A',0,0,0,0,'B','B','B','B'};
if (zvfs_pread(file, got, sizeof(got), 0) != 12) { rc = 7; goto out; }
if (expect_eq("pread/pwrite-hole", got, exp, sizeof(exp)) != 0) { rc = 8; goto out; }
/* 验证旧 read/write 顺序语义未回退 */
file->current_offset = 0;
const char *c = "CCCC";
if (zvfs_write(file, (const uint8_t *)c, 4) != 4) { rc = 9; goto out; }
file->current_offset = 0;
uint8_t got2[4] = {0};
if (zvfs_read(file, got2, sizeof(got2)) != 4) { rc = 10; goto out; }
if (expect_eq("read/write-seq", got2, c, 4) != 0) { rc = 11; goto out; }
rc = 0;
printf("[PASS] phase1_api_check\n");
out:
if (created) {
(void)zvfs_close(file);
(void)zvfs_delete(file);
}
if (mounted) {
(void)zvfs_umount(fs);
}
free(dirent);
free(file);
free(fs);
return rc;
}
EOF
2.2 编译并运行
gcc -O2 -Wall -Wextra -std=gnu11 \
-I/home/lian/share/10.1-spdk/zvfs/zvfs \
-I/home/lian/share/10.1-spdk/zvfs/spdk/include \
-o /tmp/phase1_api_check /tmp/phase1_api_check.c \
/home/lian/share/10.1-spdk/zvfs/zvfs/libzvfs.so -ldl
sudo /tmp/phase1_api_check
期望:
- 输出包含:
[OK] pread/pwrite-hole[OK] read/write-seq[PASS] phase1_api_check
3) 旧 POSIX 路径回归(LD_PRELOAD)
cd /home/lian/share/10.1-spdk/zvfs
make -C test -j
sudo env LD_PRELOAD=/home/lian/share/10.1-spdk/zvfs/zvfs/libzvfs.so ./test/bin/test_basic /zvfs
sudo env LD_PRELOAD=/home/lian/share/10.1-spdk/zvfs/zvfs/libzvfs.so ./test/bin/test_lseek /zvfs
sudo env LD_PRELOAD=/home/lian/share/10.1-spdk/zvfs/zvfs/libzvfs.so ./test/bin/test_two_files /zvfs
期望:
test_basic、test_lseek、test_two_files通过。- 无崩溃、无明显数据错乱。
若出现一次性 zvfs_mount failed,建议先确保没有残留测试进程,再重跑一次验证命令。
4) 验证完成后回填
请把验证结果回填到 plan/plan.md 的 phase1 区域:
### 阶段验收### 正确性验证方案
若任何一项失败,请附上:
- 命令;
- 错误输出;
- 是否可稳定复现。