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

@@ -8,7 +8,8 @@ BINS := $(addprefix $(BIN_DIR)/,$(BIN_NAMES))
RUN_DIR ?= /tmp/zvfs-test
RUN_BINS ?= test_basic test_lseek test_dual_open_same_file test_two_files \
test_single_file_perf test_single_file_random_perf \
test_single_file_random_noaligned_perf test_write_file test_read_delete_file
test_single_file_random_noaligned_perf test_write_file test_read_delete_file \
test_phase2_posix
.PHONY: all clean list run-test

98
test/test_phase2_posix.c Normal file
View File

@@ -0,0 +1,98 @@
#include "test_utils.h"
#include <sys/stat.h>
static int expect_errno(const char *what, int exp)
{
if (errno != exp) {
fprintf(stderr, "%s: errno=%d expected=%d\n", what, errno, exp);
return -1;
}
return 0;
}
static int test_phase2(const char *root)
{
char dir[PATH_MAX];
char file[PATH_MAX];
char file2[PATH_MAX];
struct stat st;
int dfd = -1;
int fd = -1;
snprintf(dir, sizeof(dir), "%s/p2db", root);
snprintf(file, sizeof(file), "%s/p2db/data.log", root);
snprintf(file2, sizeof(file2), "%s/p2db/data2.log", root);
(void)unlink(file2);
(void)unlink(file);
(void)rmdir(dir);
if (mkdir(dir, 0755) != 0) { perror("mkdir"); return 1; }
dfd = open(dir, O_RDONLY | O_DIRECTORY);
if (dfd < 0) { perror("open dir"); return 2; }
fd = openat(dfd, "data.log", O_CREAT | O_RDWR | O_TRUNC, 0644);
if (fd < 0) { perror("openat create"); return 3; }
if (write(fd, "ABCD", 4) != 4) { perror("write"); return 4; }
if (pwrite(fd, "XYZ", 3, 8) != 3) { perror("pwrite"); return 5; }
char buf[16] = {0};
ssize_t n = pread(fd, buf, 11, 0);
if (n != 11) { perror("pread"); return 6; }
if (memcmp(buf, "ABCD", 4) != 0 || buf[4] || buf[5] || buf[6] || buf[7] ||
memcmp(buf + 8, "XYZ", 3) != 0) {
fprintf(stderr, "pread sparse verify failed\n");
return 7;
}
if (fsync(fd) != 0) { perror("fsync"); return 8; }
if (fdatasync(fd) != 0) { perror("fdatasync"); return 9; }
if (fstat(fd, &st) != 0) { perror("fstat"); return 10; }
if (st.st_size != 11) {
fprintf(stderr, "fstat size=%ld expected=11\n", (long)st.st_size);
return 11;
}
if (ftruncate(fd, 4) != 0) { perror("ftruncate"); return 12; }
memset(buf, 0, sizeof(buf));
n = pread(fd, buf, 16, 0);
if (n != 4 || memcmp(buf, "ABCD", 4) != 0) {
fprintf(stderr, "truncate readback failed n=%zd\n", n);
return 13;
}
if (rename(file, file2) != 0) { perror("rename"); return 14; }
if (access(file, F_OK) == 0 || expect_errno("access old", ENOENT) != 0) {
return 15;
}
if (access(file2, F_OK) != 0) { perror("access new"); return 16; }
int fd2 = open(file2, O_CREAT | O_EXCL | O_RDWR, 0644);
if (fd2 >= 0 || expect_errno("open excl", EEXIST) != 0) {
if (fd2 >= 0) close(fd2);
return 17;
}
int rd = open(file2, O_RDONLY);
if (rd < 0) { perror("open rdonly"); return 18; }
if (write(rd, "Q", 1) >= 0 || expect_errno("write rdonly", EBADF) != 0) {
close(rd);
return 19;
}
close(rd);
close(fd);
close(dfd);
if (unlink(file2) != 0) { perror("unlink"); return 20; }
if (rmdir(dir) != 0) { perror("rmdir"); return 21; }
return 0;
}
int main(int argc, char **argv)
{
const char *root = argc >= 2 ? argv[1] : "/zvfs";
int rc = test_phase2(root);
return report_result("test_phase2_posix", rc);
}