>写一个新的’.tmp’文件.
>使用rename()系统调用来替换现有文件.
>正在从远程NFS客户端访问此文件.
我们这样做,因为我们想要原子文件更新,而rename()
规范说:
If newpath already exists,it will be atomically replaced,so that
there is no point at which another process attempting to access
newpath will find it missing. However,there will probably be a
window in which both oldpath and newpath refer to the file being
renamed.
我们依赖这种行为.
但是最近,由于迁移到新的NetApp(群集模式,从7模式) – 我们有一个过程偶尔会因ENOENT而崩溃 – 没有这样的文件或目录.
“非常偶然”,我的意思是 – 在过去几周里,每5分钟左右就会发生4到5次.
我正在与供应商一起调查这是否可能是他们的NFS服务器的错误.
但我实际上想弄清楚的是,原子性保证是否实际适用于NFS.有人能够为我澄清rename()的原子保证是否适用于多客户端NFS场景?我不确定这个功能是否已经起作用,但从一开始就无法保证.
来自:RFC1813
Procedure RENAME renames the file identified by from.name
in the directory,from.dir,to to.name in the directory,
to.dir. The operation is required to be atomic to the
client.
如果它是相关的,我们已经让SL 6.5客户端在ONTAP-CDOT 8.3上访问NFS数据存储区.
解决方法
这总是一个有趣的挑战,我知道没有重写应用程序的唯一工作是使用选项sync挂载共享并更改NFS服务器以使用no_wdelay.我不记得如何在NetApp中设置no_wdelay.
这种方法的缺点是,如果你对这个共享有很多同时写入,它们会以指数方式变慢.您可能想要询问NetApp如何在该共享上设置no_wdelay,或者只是向他们描述问题.他们可能有更好的想法.我至少8年没有接触过NetApp.