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

Gan*_*ang 11 linux perl nfs

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

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

write_key_file();  # write a file that must be checked before proceeding
Run Code Online (Sandbox Code Playgroud)

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

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

if( -e $file){}
Run Code Online (Sandbox Code Playgroud)

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

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

我不打算检查这样的每个文件,但有几个关键位置,以获得正确的文件状态是很重要的.

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

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

A - NFS客户端设置

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

B - exit_code或返回写入函数的代码

$exit_code = write_key_file();
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

The*_*ist 11

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

...只有open()fopen()需要保证他们获得了一致的处理特定文件进行读取和写入.stat和朋友不需要检索新的属性.因此,为求贴近打开高速缓存一致性,只open()fopen()被认为是一个"打开事件",其中新鲜的属性需要被立即从服务器获取的[1] .


以下解决方案属于A类:NFS客户端设置,
即如果您不希望将缓存的文件/目录条目提供给客户端,请禁用缓存.

设置共享缓存

如果NFS挂载中的文件(正在检查其存在)是由同一客户端上的另一个应用程序创建的(可能使用另一个挂载到同一NFS导出),请考虑在客户端上使用单个共享NFS缓存.

使用该sharecache选项在客户端上设置NFS挂载.

此选项确定在同时挂载同一个导出时,如何共享客户端的数据高速缓存和属性高速缓存.使用相同的缓存可减少客户端上的内存要求,并在通过不同的挂载点访问同一远程文件时向应用程序提供相同的文件内容.


在没有缓存的情况下设置NFS安装

禁用属性缓存.

使用该noac选项在客户端上挂载NFS共享.

或者,禁用缓存的目录属性.

用于acdirmin=0,acdirmax=0将缓存超时设置为0(有效禁用缓存).


设置NFS安装以忽略查找缓存

使用lookupcache=positiveORlookupcache=none

(可用选项:all,positivenone)

尝试通过NFS装载访问目录条目时,
如果服务器上存在请求的目录条目,则结果称为positive.
如果服务器上不存在请求的目录条目,则结果称为negative.

如果lookupcache未指定该选项,或者all指定了if ,则客户端假定两种类型的目录高速缓存条目都有效,直到其父目录的高速缓存属性到期为止.

如果pospositive指定,则客户端假定肯定条目在其父目录的高速缓存属性到期之前有效,但始终在应用程序可以使用它们之前重新验证否定条目.

如果none指定,则客户端在应用程序可以使用它们之前重新验证两种类型的目录高速缓存条目.这允许快速检测由其他客户端创建或删除的文件,但可能会影响应用程序和服务器性能.


参考:
1.Linux NFS客户端中的即将打开的缓存一致性
2. NFS - 以编程方式检测远程创建的文件?
3. NFS缓存:在服务器
4 上修改时,客户端上未更新文件内容.NFS手册页.特别是"数据和元数据一致性"部分.