次のコード スニペットは 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) およびシェル ユーティリティ flock(1) で再現できます。
提案/回避策はありますか?
PS: NFSv4 で Oracle JDK 1.7.0_25 を使用
EDIT : このロックは、分散された高可用性クラスターでアクティブなプロセスを識別するために使用されます。終了コードは 137 です。問題を検出する方法。ファイルを閉じて、再取得を試みてください。