linux – 在NFS原子上重命名()

前端之家收集整理的这篇文章主要介绍了linux – 在NFS原子上重命名()前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个过程:

>写一个新的’.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数据存储区.

解决方法

避免NFS中的竞争条件

这总是一个有趣的挑战,我知道没有重写应用程序的唯一工作是使用选项sync挂载共享并更改NFS服务器以使用no_wdelay.我不记得如何在NetApp中设置no_wdelay.

这种方法的缺点是,如果你对这个共享有很多同时写入,它们会以指数方式变慢.您可能想要询问NetApp如何在该共享上设置no_wdelay,或者只是向他们描述问题.他们可能有更好的想法.我至少8年没有接触过NetApp.

猜你在找的Linux相关文章