对于已存在的nFS挂载目录文件,Python os.path.Existes()失败 [英] python os.path.exists() failing for nfs mounted directory file that exists

查看:7
本文介绍了对于已存在的nFS挂载目录文件,Python os.path.Existes()失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我基本上有一个站点的Web服务器和另一个简单地存储文件的Web服务器。文件服务器通过挂载其中一个目录连接到主服务器。该网站运行的是Django,所以我主要处理的是蟒蛇。无论如何,我似乎遇到了一些文件被报告为不存在的问题,即使它们实际上存在。

基本上是当我调用

filepath = '/path/to/file/on/nfs/share'
exists = os.path.exists(filepath)

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

在某些平台上,如果未授予对请求的文件执行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)

编辑:

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

在前端,有一个被ping的url,它为该文件调用os.path.Existes(),当它这样做时,资源将通过AJAX加载。

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

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

推荐答案

这是由于发现的nff缓存here

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

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

我认为它的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客户端之间提供更好的缓存一致性,但会带来显著的性能损失。因此,我们鼓励明智地使用文件锁定。数据和元数据一致性部分详细讨论了这些权衡。

这篇关于对于已存在的nFS挂载目录文件,Python os.path.Existes()失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆