【发布时间】:2019-06-09 06:53:07
【问题描述】:
在我的 java 代码中,我正在读取一个 NFS 挂载目录(代码在 NFS client 机器上运行)。只要 NFS 服务器机器启动并运行,一切都很好,但是当 NFS 服务器关闭时(出于任何原因),代码会挂在任何创建新文件到 nfs 挂载目录的地方。如果我只是 umount nfs 目录,我的代码运行没有问题,但我不想每天手动检查此类问题,只想在我的代码中处理这种情况
这是 NFS 服务器的 /etc/exports:
/var/nfs/general *(rw,insecure,all_squash,no_subtree_check)
实际的java代码很简单:
log.info("before new");
File file = new File("/var/nfs/general");
log.info("after new");
它只在日志文件中打印“before new”,永远不会到达“after new”
我将新文件放入 Executor 服务中,超时时间与建议的一样,但即使超时 2 秒仍会挂起:
How do I call some blocking method with a timeout in Java?
-
操作系统:两台服务器(NFS 客户端和服务器)上的 ubuntu 服务器 16.04
Java 版本:1.8_172
【问题讨论】:
-
您可能希望在客户端对 NFS 驱动器进行软挂载,这样可以避免挂起,直到调用服务器备份时才挂起。
-
ServerFault SE 上的类似问题(类似答案):serverfault.com/questions/710391/nfs-server-hung-threads
-
软挂载也没有帮助,仍然挂起
-
嗯,有一个
timeo=值可以在您将NFS 挂载设置为软时指定,您定义了吗?否则默认值似乎是 1 分钟,这可能足以让您认为它仍然无限期挂起。如果您仍然卡住,您能否将/etc/fstab中的相关行添加到您的问题中?编辑:此外可以有一个retrans=n(默认n=3)选项,它乘以等待读取错误的时间(超时是一次读取失败,重试最多n次读取失败) -
在我的测试环境中我没有使用/etc/fstab,只使用了mount命令和-o soft,intr