From: AsamK Date: Wed, 18 May 2022 13:27:02 +0000 (+0200) Subject: Cleanup fileChannel if file locking fails X-Git-Tag: v0.10.6~6 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/7ac6c9a170eba9dab7f9f0ebc6c3bffc017ab691 Cleanup fileChannel if file locking fails --- diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java b/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java index 33b9e80c..79f43670 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java @@ -884,17 +884,25 @@ public class SignalAccount implements Closeable { private static Pair openFileChannel(File fileName, boolean waitForLock) throws IOException { var fileChannel = new RandomAccessFile(fileName, "rw").getChannel(); - var lock = fileChannel.tryLock(); - if (lock == null) { - if (!waitForLock) { - logger.debug("Config file is in use by another instance."); - throw new IOException("Config file is in use by another instance."); + try { + var lock = fileChannel.tryLock(); + if (lock == null) { + if (!waitForLock) { + logger.debug("Config file is in use by another instance."); + throw new IOException("Config file is in use by another instance."); + } + logger.info("Config file is in use by another instance, waiting…"); + lock = fileChannel.lock(); + logger.info("Config file lock acquired."); + } + final var result = new Pair<>(fileChannel, lock); + fileChannel = null; + return result; + } finally { + if (fileChannel != null) { + fileChannel.close(); } - logger.info("Config file is in use by another instance, waiting…"); - lock = fileChannel.lock(); - logger.info("Config file lock acquired."); } - return new Pair<>(fileChannel, lock); } public void addPreKeys(ServiceIdType serviceIdType, List records) {