2016-10-26 31 views
0

我正在编写压力测试套件来测试通过NFS的分布式文件系统。“过时的文件句柄”错误,当进程尝试读取文件时,其他进程已经删除

在某些情况下,当一些进程删除文件,而另一些进程尝试从它读取,我得到“陈旧的文件句柄”错误(116)。

在这种情况下,这种错误是否可以接受?

测试工作如下:

  1. 启动客户机的x个
  2. 每台客户端计算机上运行Ÿ处理
  3. 每个进程都可以做任何文件操作STAT /读/删除/打开
  4. 提到的文件操作是标准的python方法 - os.stat/read/os.remove/open
  5. 所有文件都为空0字节数据

文件是存在,为成功stat运行表明:

controller_debug.log.2:2016年10月26日15:02:30156; INFO - [LG-E27A-LNX:是0xA]:成品640522b4d94c453ea545cb86568320ca,结果: 成功| stat | 35 35 48 012 012 012 012 012 012数据:{} | 2016年10月26日15:02:30.156

过程0x1在客户端完成CLIENT-A成功删除:

controller_debug.log.2:2016年10月26日15:02:30164; INFO - [CLIENT-A:0x1]:已完成5f5dfe6a06de495f851745a78857eec1,结果: 成功|删除| 35 35 48 012 012 012 012 012 012数据:{} | 2016年10月26日15:02:30.161

3毫秒之后,在客户端CLIENT-B过程0xb失败 “读” OP因 “过时的文件句柄”

controller_debug.log.2 2016 -10-26 15:02:30,164; INFO - [CLIENT-B:0xb]:finished e84e2064ead042099310af1bd44821c0,result: failed |阅读| /mnt/DIRSPLIT-node0.b27-1/JUyw481MfvsBHOm1KQu7sHRB6ffAXKjwIATlsXmOgWh8XKQaIrPbxLgAo7sucdAM/o6V266xE8bTaUGzk8YDMfDAJp0YIfbT4fIK1oZ2R20tRX3xFCvjISj7WuMEwEV41 | [errno:116] |陈旧的文件句柄| 142 |数据:{} | 2016/10/26 15:02:30.160 controller_debug.log。2:2016年10月26日15:02:30164;错误 - 操作中读取上的文件 JUyw481MfvsBHOm1KQu7sHRB6ffAXKjwIATlsXmOgWh8XKQaIrPbxLgAo7sucdAM/o6V266xE8bTaUGzk8YDMfDAJp0YIfbT4fIK1oZ2R20tRX3xFCvjISj7WuMEwEV41 意外失败,由于过时的文件句柄

感谢

+2

是的,这是一个可接受的错误代码给出的情况下(请参阅https://access.redhat.com/solutions/29626,条件2),但它可能不是唯一可能的回应。您必须阅读规格和来源才能确定。你能澄清一下,如果有什么,表明这可能不是一个合适的回应? –

+0

@JakeMitchell感谢您的链接杰克。我确实知道ESTALE可以用于目录,但是可以在文件中找到关于ESTALE的任何信息,并且由于我正在开发测试文件系统,所以我不能相信它如何处理nfs错误。你是否也有源码和规格的链接? – Samuel

+0

您正在使用哪种版本的Python,以及如何开始测试流程?它可能与'fork'的行为有关,因为文件描述符依赖于POSIX,这不允许使用分叉进程。 –

回答

1

这是完全预料。在对象(不管是文件还是目录)被删除之后,NFS规范清楚了如何使用文件句柄。 Section 4明确解决这个问题。例如:

当文件系统对象被删除时,持久性文件句柄将变为过时或无效。当服务器提供一个引用已删除对象的持久性文件句柄时,它务必返回一个NFS4ERR_STALE错误。

这是这样一个共同的问题,它甚至在NFS FAQ第A.10其自己的条目,它说ESTALE错误的一个常见原因是:

文件句柄指已删除的文件。在服务器上删除一个文件之后,客户端不会发现它们,直到它们尝试使用它们之前从LOOKUP缓存的文件句柄来访问该文件。使用rsync或mv替换正在另一个客户端上使用的文件是导致ESTALE错误的常见情况。

预期的解决方案是您的客户端应用程序必须关闭并重新打开文件以查看发生了什么。或者,如常见问题解答说:

...从一个ESTALE错误中恢复,应用程序必须关闭发生错误的文件或目录,并重新打开它,因此NFS客户端可以再次解决路径和检索新的文件句柄。

相关问题