Python &引用;陈旧文件句柄";错误,当进程尝试读取文件时,其他进程已被删除
我正在编写压力测试套件,用于测试NFS上的分布式文件系统 在某些情况下,当某个进程删除文件,而另一个进程试图从中读取文件时,我会遇到“Stale file handle”错误(116) 在这种情况下,这种错误是可以预期和接受的吗 测试工作如下:Python &引用;陈旧文件句柄";错误,当进程尝试读取文件时,其他进程已被删除,python,linux,nfs,Python,Linux,Nfs,我正在编写压力测试套件,用于测试NFS上的分布式文件系统 在某些情况下,当某个进程删除文件,而另一个进程试图从中读取文件时,我会遇到“Stale file handle”错误(116) 在这种情况下,这种错误是可以预期和接受的吗 测试工作如下: 正在启动x台客户端计算机 每台客户机运行多个进程 每个进程都可以执行stat/read/delete/open等任何文件操作 提到的文件ops是标准的python方法-os.stat/read/os.remove/open 所有文件都是空的0字节数据 文
stat
操作显示:
控制器调试日志2:2016-10-26 15:02:30156;信息-
[LG-E27A-LNX:0xa]:完成640522b4d94c453ea545cb86568320ca,结果:
成功|统计|
/JUYW481MFVSHOM1KQU7SHRB6FFAXKJWIATLSXMOGWH8KQAIRPBXLGAO7SUCDAM/O6V266XE8BTAUGZK8YDMFDAJP0YIFB4FIK1OZ2R20TRX3XFCVJISJ7WUMEWEv41
|数据:{}2016/10/26 15:02:30.156
客户端上的进程0x1
客户端A成功删除:
控制器调试日志2:2016-10-26 15:02:30164;信息-
[客户A:0x1]:完成5f5dfe6a06de495f851745a78857eec1,结果:
成功|删除|
/JUYW481MFVSHOM1KQU7SHRB6FFAXKJWIATLSXMOGWH8KQAIRPBXLGAO7SUCDAM/O6V266XE8BTAUGZK8YDMFDAJP0YIFB4FIK1OZ2R20TRX3XFCVJISJ7WUMEWEv41
|数据:{}2016/10/26 15:02:30.161
3毫秒后,客户端client-B上的进程0xb
由于“陈旧的文件句柄”导致“读取”操作失败
控制器调试日志2:2016-10-26 15:02:30164;信息-
[客户机B:0xb]:完成e84e2064ead042099310af1bd44821c0,结果:
读取失败|
/mnt/DIRSPILT-node0.b27-1/JUYW481MFVSHOM1KQU7SHRB6FFAXKJWIATLSXMOGWH8KQAIRPBXLGAO7SUCDAM/o6V266xE8bTaUGzk8YDMfDAJp0YIfbT4fIK1oZ2R20tRX3xFCvjISj7WuMEwEV41
|[错误号:116]|陈旧文件句柄| 142 |数据:{}| 2016/10/26
15:02:30.160控制器调试日志2:2016-10-26 15:02:30164;错误-
文件读取操作意外失败
JUYW481MFVSHOM1KQU7SHRB6FFAXKJWIATLSXMOGWH8KQAIRPBXLGAO7SUCDAM/O6V266XE8BTAUGZK8YDMFDAJP0YIFB4FIK1OZ2R20TRX3XFCVJISJ7WUMEWEv41
由于文件句柄陈旧
谢谢这完全是意料之中的事。NFS规范明确了对象(无论是文件还是目录)被删除后文件句柄的使用。这显然解决了这个问题。例如:
删除文件系统对象后,持久化文件句柄将变得陈旧或无效。当服务器显示引用已删除对象的持久化文件句柄时,它必须返回NFS4ERR_STALE错误
这是一个如此普遍的问题,它甚至在的第a.10节中有自己的条目,其中说遗产错误的一个常见原因是:
文件句柄引用已删除的文件。在服务器上删除一个文件后,客户端直到尝试使用以前查找中缓存的文件句柄访问该文件时才会发现。在另一个客户端上使用文件时,使用rsync或mv替换该文件是导致ESTALE错误的常见情况
预期的解决方案是,您的客户端应用程序必须关闭并重新打开该文件才能查看发生了什么。或者,正如常见问题所说:
。。。要从ESTALE错误中恢复,应用程序必须关闭发生错误的文件或目录,然后重新打开它,以便NFS客户端可以再次解析路径名并检索新的文件句柄
是的,考虑到具体情况,这是一个可接受的错误代码(请参见条件2),但它可能不是唯一可能的响应。您必须阅读规范和来源才能确定。你能澄清一下,如果有的话,这可能不是一个合适的回答吗?@JakeMitchell感谢Jake的链接。我知道ESTALE对于目录是可以接受的,但是我可以在文件中找到任何关于ESTALE的信息,而且因为我正在测试正在开发中的文件系统,所以我不能相信它是如何处理nfs错误的。您是否也有到源代码和规范的链接?您使用的是哪一版本的python,以及如何启动测试过程?这可能与fork
的行为有关,因为文件描述符依赖于POSIX,POSIX不允许使用fork进程。@ThomasMoreau ESTALE错误是通过NFS对文件进行操作时产生的错误,而不是进程中的错误itselves@Samuel是,但是进程操作和NFS操作共享了文件描述符。如果fd关闭,则无论是谁尝试访问它,它都应该失败。