Skip to content

Commit 8bb0e19

Browse files
garyrussellartembilan
authored andcommitted
Clear lock cache in NioFileLocker (#2998)
Fixes #2980
1 parent 084aaf7 commit 8bb0e19

File tree

3 files changed

+15
-6
lines changed

3 files changed

+15
-6
lines changed

spring-integration-file/src/main/java/org/springframework/integration/file/locking/FileChannelCache.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
*/
3535
final class FileChannelCache {
3636

37-
private static ConcurrentMap<File, FileChannel> channelCache = new ConcurrentHashMap<File, FileChannel>();
37+
private static ConcurrentMap<File, FileChannel> channelCache = new ConcurrentHashMap<>();
3838

3939

4040
private FileChannelCache() {

spring-integration-file/src/main/java/org/springframework/integration/file/locking/NioFileLocker.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
*/
4141
public class NioFileLocker extends AbstractFileLockerFilter {
4242

43-
private final ConcurrentMap<File, FileLock> lockCache = new ConcurrentHashMap<File, FileLock>();
43+
private final ConcurrentMap<File, FileLock> lockCache = new ConcurrentHashMap<>();
4444

4545
@Override
4646
public boolean lock(File fileToLock) {
@@ -68,7 +68,7 @@ public boolean isLockable(File file) {
6868

6969
@Override
7070
public void unlock(File fileToUnlock) {
71-
FileLock fileLock = this.lockCache.get(fileToUnlock);
71+
FileLock fileLock = this.lockCache.remove(fileToUnlock);
7272
try {
7373
if (fileLock != null) {
7474
fileLock.release();

spring-integration-file/src/test/java/org/springframework/integration/file/locking/NioFileLockerTests.java

+12-3
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,20 @@
2020

2121
import java.io.File;
2222
import java.io.IOException;
23+
import java.lang.reflect.Field;
2324
import java.util.ArrayList;
24-
import java.util.List;
25+
import java.util.Map;
2526

2627
import org.junit.Rule;
2728
import org.junit.Test;
2829
import org.junit.rules.TemporaryFolder;
2930

3031
import org.springframework.integration.file.filters.FileListFilter;
32+
import org.springframework.integration.test.util.TestUtils;
3133

3234
/**
3335
* @author Iwein Fuld
36+
* @author Gary Russell
3437
*/
3538
public class NioFileLockerTests {
3639

@@ -47,13 +50,18 @@ public void create() throws IOException {
4750
};
4851

4952
@Test
50-
public void fileListedByFirstFilter() throws IOException {
53+
public void fileListedByFirstFilter() throws Exception {
5154
NioFileLocker filter = new NioFileLocker();
5255
File testFile = new File(workdir, "test0");
5356
testFile.createNewFile();
5457
assertThat(filter.filterFiles(workdir.listFiles()).get(0)).isEqualTo(testFile);
5558
filter.lock(testFile);
5659
assertThat(filter.filterFiles(workdir.listFiles()).get(0)).isEqualTo(testFile);
60+
filter.unlock(testFile);
61+
Field channelCache = FileChannelCache.class.getDeclaredField("channelCache");
62+
channelCache.setAccessible(true);
63+
assertThat(((Map<?, ?>) channelCache.get(null))).isEmpty();
64+
assertThat(((Map<?, ?>) TestUtils.getPropertyValue(filter, "lockCache", Map.class))).isEmpty();
5765
}
5866

5967
@Test
@@ -64,7 +72,8 @@ public void fileNotListedWhenLockedByOtherFilter() throws IOException {
6472
testFile.createNewFile();
6573
assertThat(filter1.filterFiles(workdir.listFiles()).get(0)).isEqualTo(testFile);
6674
filter1.lock(testFile);
67-
assertThat(filter2.filterFiles(workdir.listFiles())).isEqualTo((List<File>) new ArrayList<File>());
75+
assertThat(filter2.filterFiles(workdir.listFiles())).isEqualTo(new ArrayList<File>());
76+
filter1.unlock(testFile);
6877
}
6978

7079
}

0 commit comments

Comments
 (0)