并发写入 NFS 期间的读取问题

问题描述 投票:0回答:1

我有两个进程:一个是使用 fwrite 循环写入文件,另一个是使用 read 循环读取文件。读取器进程有时会返回正读取大小,但缓冲区中全部为 0x00,但当它尝试再次读取时,它工作正常。该文件位于网络文件系统 wekafs 上,读取过程发生在写入者仍在写入文件时(实时读取)。

这是阅读器进程的代码:

#include <iostream>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    const char* filename = "<my file>";
    
    // Open the file for reading
    int fd = open(filename, O_DIRECT | O_RDONLY);
    if (fd < 0) {
        perror("Failed to open file for reading");
        return 1;
    }

    size_t sz = 40000;
    char *read_data;
    if (posix_memalign((void**)&read_data, 512, sz) != 0) {
        perror("Failed to allocate aligned memory");
        return 1;
    }

    bool loop = true;
    size_t total_bytes = 0;

    while (loop) {
        ssize_t bytes_read = read(fd, read_data, sz);
        if (bytes_read < 0) {
            perror("Failed to read from file");
            break;
        } else if (bytes_read == 0) {
            std::cout << "End of file reached." << std::endl;
            break;
        } else {
            total_bytes += bytes_read;
            std::cout << "Read " << bytes_read << " bytes, total so far: " << total_bytes << std::endl;
        }
    }

    // Clean up
    free(read_data);
    close(fd);

    return 0;
}

问题: 有时,当读取器尝试读取时,它会在缓冲区中得到全零,我认为这是垃圾数据。当读者再次尝试时,效果很好。 写入器不断写入文件,读取器在文件被修改的同时实时读取文件(实时读取)。 该文件位于 wekafs 网络文件系统上,我不确定问题是否与网络延迟或文件系统的缓存问题有关。

我尝试过的: 确保阅读器正确检查错误(即检查 read() 返回值)。

问题是否与网络文件系统如何处理实时读写有关,或者我在处理读写器同步时还遗漏了什么?

c++ memory concurrency filesystems nfs
1个回答
0
投票

当您使用

fwrite
时,您的写入过程会使用缓冲IO。这意味着,应用程序缓冲区中的某些数据和 NFS 客户端本地页面缓存中的某些数据同步后,NFS 服务器将面临内存压力或关闭。但是,读取器进程使用直接 IO,从而读取 NFS 服务器上的数据。为了确保写入的数据可供客户端使用,写入进程应使用直接 IO,或调用
fflush
来同步应用程序缓冲区,然后在文件描述符上调用
fsync
将数据推送到 NFS 服务器。

© www.soinside.com 2019 - 2024. All rights reserved.