我正在编写应力测试套件,以测试通过NFS进行分布式文件系统的性能。
在某些情况下,当某个进程删除文件时,同时另一个进程试图从该文件中读取数据时,会出现“过期文件句柄”错误(116)。
这种类型的错误在这种竞争条件下是否是预期且可接受的?
测试工作如下:
- 启动 x 个客户端机器
- 每个客户端机器运行 y 个进程
- 每个进程可以执行任何文件操作,例如 stat/read/delete/open
- 上述文件操作是标准的Python方法 - os.stat/read/os.remove/open
- 所有文件都是空的 0 字节数据
文件存在,因为成功的 stat
操作显示:
controller_debug.log.2:2016-10-26 15:02:30,156;INFO - [LG-E27A-LNX:0xa]: finished 640522b4d94c453ea545cb86568320ca, result: success | stat | /JUyw481MfvsBHOm1KQu7sHRB6ffAXKjwIATlsXmOgWh8XKQaIrPbxLgAo7sucdAM/o6V266xE8bTaUGzk8YDMfDAJp0YIfbT4fIK1oZ2R20tRX3xFCvjISj7WuMEwEV41 | data: {} | 2016/10/26 15:02:30.156
客户端 CLIENT-A
上的进程 0x1
成功删除了该文件:
controller_debug.log.2:2016-10-26 15:02:30,164;INFO - [CLIENT-A:0x1]: finished 5f5dfe6a06de495f851745a78857eec1, result: success | delete |
3毫秒后,客户端
CLIENT-B
上的进程0xb
由于"Stale file handle"而失败了"read"操作。controller_debug.log.2:2016-10-26 15:02:30,164;INFO - [CLIENT-B:0xb]:完成e84e2064ead042099310af1bd44821c0,结果:失败|读取|/mnt/DIRSPLIT-node0.b27-1/JUyw481MfvsBHOm1KQu7sHRB6ffAXKjwIATlsXmOgWh8XKQaIrPbxLgAo7sucdAM/o6V266xE8bTaUGzk8YDMfDAJp0YIfbT4fIK1oZ2R20tRX3xFCvjISj7WuMEwEV41 | [errno:116] | Stale file handle | 142 | data: {} | 2016/10/26 15:02:30.160 controller_debug.log.2:2016-10-26 15:02:30,164;ERROR - 因为文件句柄过期,文件JUyw481MfvsBHOm1KQu7sHRB6ffAXKjwIATlsXmOgWh8XKQaIrPbxLgAo7sucdAM/o6V266xE8bTaUGzk8YDMfDAJp0YIfbT4fIK1oZ2R20tRX3xFCvjISj7WuMEwEV41上的操作读取意外失败。
感谢
fork
的行为有关,因为文件描述符依赖于POSIX,不允许使用分叉进程。 - Thomas Moreau