我在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 ;
}