CAMEL-8353: FileLockExclusiveReadLockStrategy - Should defer closing channel till release lock
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/8ed78181 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/8ed78181 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/8ed78181 Branch: refs/heads/camel-2.14.x Commit: 8ed78181c2f0aa192bf4057edb3a9f9bbff244ac Parents: 4202b5e Author: Claus Ibsen <davscl...@apache.org> Authored: Sun Feb 15 08:47:28 2015 +0100 Committer: Claus Ibsen <davscl...@apache.org> Committed: Sun Feb 15 09:17:53 2015 +0100 ---------------------------------------------------------------------- .../main/java/org/apache/camel/Exchange.java | 2 ++ .../FileLockExclusiveReadLockStrategy.java | 33 ++++++++++++++------ .../MarkerFileExclusiveReadLockStrategy.java | 15 ++++----- 3 files changed, 34 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/8ed78181/camel-core/src/main/java/org/apache/camel/Exchange.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/Exchange.java b/camel-core/src/main/java/org/apache/camel/Exchange.java index ab12c89..1704999 100644 --- a/camel-core/src/main/java/org/apache/camel/Exchange.java +++ b/camel-core/src/main/java/org/apache/camel/Exchange.java @@ -129,6 +129,8 @@ public interface Exchange { String FILTER_MATCHED = "CamelFilterMatched"; String FILE_LOCK_FILE_ACQUIRED = "CamelFileLockFileAcquired"; String FILE_LOCK_FILE_NAME = "CamelFileLockFileName"; + String FILE_LOCK_EXCLUSIVE_LOCK = "CamelFileLockExclusiveLock"; + String FILE_LOCK_RANDOM_ACCESS_FILE = "CamelFileLockRandomAccessFile"; String GROUPED_EXCHANGE = "CamelGroupedExchange"; http://git-wip-us.apache.org/repos/asf/camel/blob/8ed78181/camel-core/src/main/java/org/apache/camel/component/file/strategy/FileLockExclusiveReadLockStrategy.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/component/file/strategy/FileLockExclusiveReadLockStrategy.java b/camel-core/src/main/java/org/apache/camel/component/file/strategy/FileLockExclusiveReadLockStrategy.java index ca6797c..ae5b0ff 100644 --- a/camel-core/src/main/java/org/apache/camel/component/file/strategy/FileLockExclusiveReadLockStrategy.java +++ b/camel-core/src/main/java/org/apache/camel/component/file/strategy/FileLockExclusiveReadLockStrategy.java @@ -43,8 +43,6 @@ public class FileLockExclusiveReadLockStrategy extends MarkerFileExclusiveReadLo private static final Logger LOG = LoggerFactory.getLogger(FileLockExclusiveReadLockStrategy.class); private long timeout; private long checkInterval = 1000; - private FileLock lock; - private String lockFileName; private LoggingLevel readLockLoggingLevel = LoggingLevel.WARN; @Override @@ -65,12 +63,15 @@ public class FileLockExclusiveReadLockStrategy extends MarkerFileExclusiveReadLo FileChannel channel = null; RandomAccessFile randomAccessFile = null; + + boolean exclusive = false; + FileLock lock = null; + try { randomAccessFile = new RandomAccessFile(target, "rw"); // try to acquire rw lock on the file before we can consume it channel = randomAccessFile.getChannel(); - boolean exclusive = false; StopWatch watch = new StopWatch(); while (!exclusive) { @@ -93,7 +94,6 @@ public class FileLockExclusiveReadLockStrategy extends MarkerFileExclusiveReadLo } if (lock != null) { LOG.trace("Acquired exclusive read lock: {} to file: {}", lock, target); - lockFileName = target.getName(); exclusive = true; } else { boolean interrupted = sleep(); @@ -117,10 +117,20 @@ public class FileLockExclusiveReadLockStrategy extends MarkerFileExclusiveReadLo return false; } } finally { - IOHelper.close(channel, "while acquiring exclusive read lock for file: " + lockFileName, LOG); - IOHelper.close(randomAccessFile, "while acquiring exclusive read lock for file: " + lockFileName, LOG); + // close channels if we did not grab the lock + if (!exclusive) { + IOHelper.close(channel, "while acquiring exclusive read lock for file: " + target, LOG); + IOHelper.close(randomAccessFile, "while acquiring exclusive read lock for file: " + target, LOG); + + // and also must release super lock + super.releaseExclusiveReadLock(operations, file, exchange); + } } + // we grabbed the lock + exchange.setProperty(Exchange.FILE_LOCK_EXCLUSIVE_LOCK, lock); + exchange.setProperty(Exchange.FILE_LOCK_RANDOM_ACCESS_FILE, randomAccessFile); + return true; } @@ -131,13 +141,18 @@ public class FileLockExclusiveReadLockStrategy extends MarkerFileExclusiveReadLo // must call super super.releaseExclusiveReadLock(operations, file, exchange); + String target = file.getFileName(); + FileLock lock = exchange.getProperty(Exchange.FILE_LOCK_EXCLUSIVE_LOCK, FileLock.class); + RandomAccessFile rac = exchange.getProperty(Exchange.FILE_LOCK_RANDOM_ACCESS_FILE, RandomAccessFile.class); + if (lock != null) { - Channel channel = lock.channel(); + Channel channel = lock.acquiredBy(); try { lock.release(); } finally { - // must close channel first - IOHelper.close(channel, "while releasing exclusive read lock for file: " + lockFileName, LOG); + // close channel as well + IOHelper.close(channel, "while releasing exclusive read lock for file: " + target, LOG); + IOHelper.close(rac, "while releasing exclusive read lock for file: " + target, LOG); } } } http://git-wip-us.apache.org/repos/asf/camel/blob/8ed78181/camel-core/src/main/java/org/apache/camel/component/file/strategy/MarkerFileExclusiveReadLockStrategy.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/component/file/strategy/MarkerFileExclusiveReadLockStrategy.java b/camel-core/src/main/java/org/apache/camel/component/file/strategy/MarkerFileExclusiveReadLockStrategy.java index 56d6282f..6deebff 100644 --- a/camel-core/src/main/java/org/apache/camel/component/file/strategy/MarkerFileExclusiveReadLockStrategy.java +++ b/camel-core/src/main/java/org/apache/camel/component/file/strategy/MarkerFileExclusiveReadLockStrategy.java @@ -83,15 +83,16 @@ public class MarkerFileExclusiveReadLockStrategy implements GenericFileExclusive return; } - String lockFileName = exchange.getProperty(Exchange.FILE_LOCK_FILE_NAME, getLockFileName(file), String.class); - File lock = new File(lockFileName); // only release the file if camel get the lock before if (exchange.getProperty(Exchange.FILE_LOCK_FILE_ACQUIRED, false, Boolean.class)) { - LOG.trace("Unlocking file: {}", lockFileName); - boolean deleted = FileUtil.deleteFile(lock); - LOG.trace("Lock file: {} was deleted: {}", lockFileName, deleted); - } else { - LOG.trace("Don't try to delete the Lock file: {} as camel doesn't get to lock before.", lockFileName); + String lockFileName = exchange.getProperty(Exchange.FILE_LOCK_FILE_NAME, getLockFileName(file), String.class); + File lock = new File(lockFileName); + + if (lock.exists()) { + LOG.trace("Unlocking file: {}", lockFileName); + boolean deleted = FileUtil.deleteFile(lock); + LOG.trace("Lock file: {} was deleted: {}", lockFileName, deleted); + } } }