问题 检查新创建的文件时如何强制刷新NFS缓存?


在Linux NFS共享安装上创建文件时,客户端是Linux或Mac机器。文件的存在与否是下一步操作的关键,但检查并不总是返回正确的结果:

例如我在perl中这样做,这仍然不能正常工作,尤其是mac机器

write_key_file();  # write a file that must be checked before proceeding

当文件存在时,以下检查不能始终返回true

问题 - perl中的此命令未在NFS系统中返回正确的状态:

if( -e $file){}

无法解决的无法解决的问题:

 sleep(5);   # wait 5 seconds
 system("ls -ltr"); # force to cache?
 if(-e $file){}

我不打算检查这样的每个文件,但有一些关键的地方,以获得正确的文件状态是很重要的。

我们是否有更好的方法在特定目录上的特定文件上强制刷新nfs缓存?谢谢。

我不确定这是一个XY问题,但有一些最薄弱的问题都可以解决。

A - NFS客户端设置

如果在这个阶段有解决方案,那就太好了!

B - exit_code或返回写入功能代码

$exit_code = write_key_file();

它的问题,而不是所有的写作都在代码块的范围内。这只能解决部分问题。

C - 禁用特定文件或目录的NFS缓存以进行文件检查

我需要确定这是可能的以及如何?如果没有,为什么?

我对所有可能的解决方案,没有解决方案或其他可能性持开放态度。


8649
2018-01-27 00:37


起源

这是一件很难看的事情。你究竟想要完成什么?可能有更好的方法。 NFS通过设计缓存以提高效率。非缓存文件系统IO可以完成,但它比你想象的要慢很多。通常,答案是 - 尝试以不同的方式。 - Sobrique
这里的 一种更直接的方法。 - ThisSuitIsBlackNot
我的观点是,这可能是一个XY问题。通过退后一步,看看你想要完成的事情,可以最好地解决一些问题 - Sobrique
您 威力 能够使用 sysopen 同 O_RDWR|O_CREAT|O_EXCL 强制NFS缓存刷新 - 如果调用成功,则文件不存在(但并非所有NFS实现都正确处理O_EXCL)。我在python中使用了这种技术(在perl我是NULL)。看我的回答 stackoverflow.com/questions/29979624/... - Dan Cornilescu
也许值得一试: unix.stackexchange.com/a/207383。他做了一个 opendir/closedir 在父目录上。 - PerlDuck


答案:


这个解决方案属于 B类:exit_code或写入函数的返回代码 

...只要 open() 和 fopen() 需要保证他们获得一个特定文件的一致句柄来进行读写。 stat 和朋友不需要检索新的属性。因此,为了 接近开放的缓存一致性, 只要 open() 和 fopen() 被视为“开放事件”,需要立即从服务器获取新属性[1]



9
2018-02-02 19:35



答案对我来说已经足够了,我只会检查写入功能的退出代码,它是遥不可及的退出代码,我将按原样离开,等待系统更新。谢谢 - Gang