java - 网络中断后由于锁定 nfs 文件导致 JVM 崩溃

标签 java nfs file-locking

以下代码片段导致JVM崩溃:如果获取锁后网络中断

    while (true) {

       //file shared over nfs
       String filename = "/home/amit/mount/lock/aLock.txt";
       RandomAccessFile file = new RandomAccessFile(filename, "rws");
       System.out.println("file opened");
       FileLock fileLock = file.getChannel().tryLock();
       if (fileLock != null) {
          System.out.println("lock acquired");
       } else {
          System.out.println("lock not acquired");
       }

       try {
          //wait for 15 sec
          Thread.sleep(30000);
       } catch (InterruptedException e) {
          e.printStackTrace();
       }
       System.out.println("closing filelock");
       fileLock.close();
       System.out.println("closing file");
       file.close();
    }

观察:JVM 收到 KILL(9) 信号并退出,退出代码为 137(128+9)。

可能在重新建立网络连接后,文件描述符表出现问题。 此行为可通过系统调用 flock(2) 和 shell 实用程序 flock(1) 重现。

有什么建议/解决方法吗?

附言:将 Oracle JDK 1.7.0_25 与 NFSv4 结合使用

编辑: 该锁将用于识别分布式高可用性集群中哪个进程处于 Activity 状态。 退出代码是 137。 我期待什么? 检测问题的方法。关闭文件并尝试重新获取。

最佳答案

退出代码 138 不暗示 SIGKILL - 这是信号 10,可以是 SIGBUS(在 solaris 上)或 SIGUSR1(在 linux 上)。遗憾的是,您没有告诉我们您使用的是哪一个。

理论上,nfs 应该透明地处理所有事情——机器崩溃、重启和清除锁。在实践中,我从未见过它在 NFS3 中运行良好,而 NFS4(您正在使用的)使事情变得更加困难,因为没有单独的 lockd() 和 statd()。

我建议您在 java 进程上运行 truss(solaris) 或 strace (linux),然后拔下网络插头,以查明到底发生了什么。但老实说,自从我使用 Unix(到现在已经超过 25 年)以来,锁定 NFS 文件系统是人们反对的做法,并且我强烈建议您编写一个小型服务器程序来处理“谁做什么”的事情。让您的客户端连接到服务器,让它们向服务器发送一些“从 X 开始”和“停止执行 X”消息,并让服务器优雅地超时连接,如果客户端没有回答超过,比方说, 5分钟。我 99% 肯定这比尝试修复 NFS 锁定花费的时间更少。

关于java - 网络中断后由于锁定 nfs 文件导致 JVM 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18869349/

相关文章:

java - JDBC setMaxRows 数据库使用

amazon-s3 - 适用于私有(private)云的 AWS S3 替代方案

java - Eclipse 标准属性 View - PropertyDescriptor - 如何使属性行变灰

java - 发现不兼容的类型 java.lang : ArrayAdapter

java - 如何在 Parcel 中使用 writeStringArray() 和 readStringArray()

linux - 拒绝来自 192.168.56.100 的挂载请求 for/ovm/mypool1/poolfs (/) : not exported

kubernetes - 为什么我的 autofs 服务不在我的 linux 容器上运行?

c - 有什么理由在 flock 上使用锁文件吗?

java - 在 Java(TM) 平台 SE 二进制文件中打开

c# - 如何为其他应用程序手动锁定文件