当另一台机器修改文件时,文件大小不正确

时间:2018-09-07 02:47:51

标签: linux amazon-web-services amazon-efs fstat

我在AWS集群环境中有两个节点。

在节点A中,我运行一个名为“读取”的测试以保持读取文件大小。文件位于安装路径下(文件系统为AWS中的EFS)。例如./read /dir/text.txt

在节点B中,我运行一个名为“写入”的测试以继续编辑同一文件。例如./write /dir/text.txt

我发现,即使使用文件锁定,有时我得到的文件大小也是0。

我尝试在同一节点上运行读写。该问题无法复制。

我尝试在非AWS的其他环境中运行,无法重现该问题。

我想知道我的代码是否有问题,或者这是对AWS EFS的限制。

谢谢。

测试代码如下:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <iostream>

using namespace std;

void printSize(int fildes)
{
    struct stat buffer;
    int         status;

    status = fstat(fildes, &buffer);

    if (status != 0)
    {
        perror("fstat");
        return;
    }

    if (buffer.st_size == 0)
    {
        cout << buffer.st_size << endl;
        cout << "press to continue" << endl;
        char a;
        cin >> a;
    }
}

int main(int argc, char** argv) {
    if (argc < 2)
        return 0;

    int signal = 0;

    while (true)
    {
        if (++signal % 100 == 0)
        {
            int time = (signal / 100) % 10;
            for (int i = 0; i < time; i++)
            {
                cout << '*';
            }
            cout << endl;
        }

        int lFileHandle = open(argv[1], O_RDONLY | O_NOCTTY);
        if (lFileHandle < 0)
        {
            perror("open");
            continue;
        }

        struct flock lFileLock;
        lFileLock.l_type = F_RDLCK;
        lFileLock.l_start = 0;
        lFileLock.l_whence = SEEK_SET;
        lFileLock.l_len = 0;
        lFileLock.l_pid = 0;

        while (true)
        {
            const int lLockingResult = fcntl(lFileHandle, F_SETLK, &lFileLock);

            if (lLockingResult != 0)
            {
                //perror("lock");
            }
            else
            {
                break;
            }
        }

        int lResult = 0;

        {
            lResult = fsync(lFileHandle);
            if (lResult != 0)
            {
                perror("fsync");
                continue;
            }
        }

        printSize(lFileHandle);

        lResult = close(lFileHandle);
        if (lResult != 0)
        {
            perror("close");
            continue;
        }
    }

    return 0;
}

测试写代码

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <iostream>

using namespace std;

int main(int argc, char** argv)   {
    if (argc < 2)
        return 0;

    int signal = 0;

    while (true)
    {
        if (++signal % 100 == 0)
        {
            int time = (signal / 100) % 10;
            for (int i = 0; i < time; i++)
            {
                cout << '*';
            }
            cout << endl;
        }

        int lFileHandle = open(argv[1], O_WRONLY | O_CREAT | O_NOCTTY);
        if (lFileHandle < 0)
        {
            perror("open");
            continue;
        }

        struct flock lFileLock;
        lFileLock.l_type = F_WRLCK;
        lFileLock.l_start = 0;
        lFileLock.l_whence = SEEK_SET;
        lFileLock.l_len = 0;
        lFileLock.l_pid = 0;

        while (true)
        {
            const int lLockingResult = fcntl(lFileHandle, F_SETLK, &lFileLock);

            if (lLockingResult == 0)
            {
                break;
            }
            else
            {
                //perror("lock");
            }
        }

        int lResult = ftruncate(lFileHandle, 0);
        if (lResult != 0)
        {
            perror("truncate");
            continue;
        }

        const int len = 1600;
        std::string lContent(len, 'A');
        const size_t lBytesWritten = write(lFileHandle, lContent.c_str(), len);
        if (lBytesWritten == -1 || lBytesWritten < len)
        {
            perror("write");
            continue;
        }

        {
            lResult = fsync(lFileHandle);
            if (lResult != 0)
            {
                perror("fsync");
                continue;
            }
        }

        lResult = close(lFileHandle);
        if (lResult != 0)
        {
            perror("close");
            continue;
        }
    }

    return 0 ;
}

0 个答案:

没有答案