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);
+            }
         }
     }
 

Reply via email to