python os.path.exists() 对于存在的 nfs 挂载目录文件失败

Jar*_*oke 5 python linux django nfs ubuntu-12.04

我基本上有一个用于网站的网络服务器和另一个仅存储文件的网络服务器。文件服务器通过安装其目录之一连接到主服务器。该网站运行 Django,所以我主要处理 python。不管怎样,我似乎遇到了一些问题,文件被报告为不存在,即使它们实际上存在。

基本上当我打电话时

filepath = '/path/to/file/on/nfs/share'
exists = os.path.exists(filepath)
Run Code Online (Sandbox Code Playgroud)

即使文件确实存在,exists也是 false,而且我知道它确实存在,因为我已将时间戳打印到日志文件中,该日志文件准确显示了它的创建时间。我不确定可能是什么问题,但我知道 os.path.exists 的文档说

在某些平台上,如果未授予对请求的文件执行 os.stat() 的权限,则该函数可能会返回 False,即使路径实际存在。

我知道情况并非如此,因为这些文件共享相同的组和组号,这也在两台服务器上共享相同的组号。它可能是一个陈旧的缓存或类似的东西吗?

我的安装是通过 fstab 自动完成的。

Client side, the settings are:
filehost:/filefolder /localfolder nfs defaults,rsize=32768,wsize=32768

Server side, the settings are:
/filefolder webserver(rw,sync,no_root_squash,no_subtree_check)
Run Code Online (Sandbox Code Playgroud)

编辑:

所以,我想了解更多信息/细节。我正在运行一个 Python 子进程,它在远程目录中生成一个文件。当发出请求时,它启动子进程并返回文件的预期位置。

在前端,有一个被 ping 的 url,它为该文件调用 os.path.exists() ,当它执行时,然后通过 ajax 加载资源。

怀疑的问题是,有时此 pinger 会报告该文件在实际可用后几秒钟内不可用。这也是我认为可能是陈旧缓存存在问题的原因。

所有文件和其中的目录都是所有者/组 www-data,以及由 django 实例化的任何子进程。而且这个问题似乎并不完全可重复。有时它会很快起作用,而另一些则需要比预期多几秒钟的时间

小智 3

这是由于 NFS 缓存造成的,如下所示:

属性缓存缓存 struct stat 中的所有内容,因此 stat() 和 fstat() 调用可以从缓存返回。如果您需要查看文件的最新大小或运行时间(或其他字段),则需要在 stat() 调用之前刷新文件的属性缓存。

请注意,如果文件句柄已缓存,则 stat() 返回该缓存文件的信息(因此结果与 fstat() 相同)。如果需要 stat() 具有给定文件名的最新文件,请首先刷新文件句柄缓存。

我认为它stat失败的原因是该文件尚未在缓存中。我在 NFS 手册页中找到了这一点:

ac / noac - Selects whether the client may cache file attributes. If neither option is specified (or if ac is specified), the client caches file attributes.

但那里也有一个警告,所以我只是忍受延迟:

使用 noac 选项可以在访问相同文件的 NFS 客户端之间提供更高的缓存一致性,但会带来严重的性能损失。因此,鼓励明智地使用文件锁定。数据和元数据一致性部分包含对这些权衡的详细讨论。