rocksdb的WAL文件的具体的实现方式是linux的mmap,如果要主备同步的话,就需要在另一个进程里面读取这个文件,下面记录一下另一个进程查看mmap(MAP_SHARED)的文件的情况。
最终的结果是,mmap并且对内存赋值后,其他进程通过read等读文件的方法就可以看到这个文件的内容。这样就可以非常简单从另一个进程的读rocksdb的WAL文件。
实验代码:
#include <fcntl.h> #include <sys/mman.h> #include <stdio.h> #include <unistd.h> int main() { int fd = open("text.txt", O_CREAT | O_RDWR | O_TRUNC, 0644); printf("before fallocate\n"); char c = getchar(); int iret = fallocate(fd, 0, 0, 1 << 15); if (iret != 0) { printf("fallocate error %d\n", iret); return 1; } printf("before mmap\n"); c = getchar(); void *ptr = mmap(NULL, 1 << 15, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (ptr == MAP_FAILED) { printf("mmap failed\n"); return 1; } printf("before write\n"); c = getchar(); char *tptr = (char *)ptr; tptr[0] = ‘a‘; tptr[1] = ‘b‘; printf("before sync\n"); close(fd); c = getchar(); printf("test end\n"); }
结果是fallocate之前文件大小是0,fallocate之后文件大小是32k,内容全为0,mmap之后不会有什么变化,write之后,不用msync其他进程就可以读到数据。
时间: 2024-10-25 13:31:18