This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push: new cc0e35f CAMEL-17068: Fix file cluster view exception handling. (#6243) cc0e35f is described below commit cc0e35fae5cde093a3e267e672964ebf7fa30b79 Author: iliya-gr <iliya...@gmail.com> AuthorDate: Tue Oct 12 07:18:24 2021 +0300 CAMEL-17068: Fix file cluster view exception handling. (#6243) Handle and log all exceptions in tryLock. Close lock file on failure and do not keep reference to channel. --- .../file/cluster/FileLockClusterView.java | 41 +++++++++++++--------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/components/camel-file/src/main/java/org/apache/camel/component/file/cluster/FileLockClusterView.java b/components/camel-file/src/main/java/org/apache/camel/component/file/cluster/FileLockClusterView.java index 700996f..e9069aa 100644 --- a/components/camel-file/src/main/java/org/apache/camel/component/file/cluster/FileLockClusterView.java +++ b/components/camel-file/src/main/java/org/apache/camel/component/file/cluster/FileLockClusterView.java @@ -16,8 +16,8 @@ */ package org.apache.camel.component.file.cluster; +import java.io.IOException; import java.io.RandomAccessFile; -import java.nio.channels.FileChannel; import java.nio.channels.FileLock; import java.nio.channels.OverlappingFileLockException; import java.nio.file.Files; @@ -30,10 +30,8 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; -import org.apache.camel.RuntimeCamelException; import org.apache.camel.cluster.CamelClusterMember; import org.apache.camel.support.cluster.AbstractCamelClusterView; -import org.apache.camel.util.IOHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,8 +40,7 @@ public class FileLockClusterView extends AbstractCamelClusterView { private final ClusterMember localMember; private final Path path; - private RandomAccessFile file; - private FileChannel channel; + private RandomAccessFile lockFile; private FileLock lock; private ScheduledFuture<?> task; @@ -76,7 +73,7 @@ public class FileLockClusterView extends AbstractCamelClusterView { @Override protected void doStart() throws Exception { - if (file != null) { + if (lockFile != null) { closeInternal(); fireLeadershipChangedEvent(Optional.empty()); @@ -86,9 +83,6 @@ public class FileLockClusterView extends AbstractCamelClusterView { Files.createDirectories(path.getParent()); } - file = new RandomAccessFile(path.toFile(), "rw"); - channel = file.getChannel(); - FileLockClusterService service = getClusterService().unwrap(FileLockClusterService.class); ScheduledExecutorService executor = service.getExecutor(); @@ -116,17 +110,24 @@ public class FileLockClusterView extends AbstractCamelClusterView { lock.release(); } - if (file != null) { - IOHelper.close(channel); - IOHelper.close(file); + closeLockFile(); + } - channel = null; - file = null; + private void closeLockFile() { + if (lockFile != null) { + try { + lockFile.close(); + } catch (Throwable ignore) { + // Ignore + } + lockFile = null; } } private void tryLock() { if (isStarting() || isStarted()) { + Exception reason = null; + try { if (localMember.isLeader()) { LOGGER.trace("Holding the lock on file {} (lock={})", path, lock); @@ -140,9 +141,10 @@ public class FileLockClusterView extends AbstractCamelClusterView { } LOGGER.debug("Try to acquire a lock on {}", path); + lockFile = new RandomAccessFile(path.toFile(), "rw"); lock = null; - lock = channel.tryLock(); + lock = lockFile.getChannel().tryLock(0, Math.max(1, lockFile.getChannel().size()), false); if (lock != null) { LOGGER.info("Lock on file {} acquired (lock={})", path, lock); @@ -152,9 +154,14 @@ public class FileLockClusterView extends AbstractCamelClusterView { } } } catch (OverlappingFileLockException e) { - LOGGER.debug("Lock on file {} not acquired ", path); + reason = new IOException(e); } catch (Exception e) { - throw new RuntimeCamelException(e); + reason = e; + } + + if (lock == null) { + LOGGER.debug("Lock on file {} not acquired ", path, reason); + closeLockFile(); } } }