Commit 5666051
committed
GH-11277: Fix local directory creation race in remote file GET
Fixes: #11277
`generateLocalDirectory()` used a non-atomic `exists()`/`mkdirs()` sequence.
With a `local-directory-expression` the eager `setupLocalDirectory()` in
`afterPropertiesSet()` is skipped, since it only runs for a `ValueExpression`,
so the directory is created per message on the calling thread. Concurrent
messages resolving to the same, not-yet-existing local directory raced on
`File.mkdirs()`: the losing threads received `false` and failed with
`IllegalArgumentException: Failed to make local directory: [...]` although the
directory existed at that point.
* Use the idempotent and concurrency-safe `Files.createDirectories()` instead,
retaining the exception type and message and propagating a genuine creation
failure as cause
This mirrors the fix applied to `FileWritingMessageHandler` in GH-11254.
Attaching the `IOException` as cause moves the root cause of the reported
`IllegalArgumentException` from itself to the `FileSystemException` raised by
the failed creation. `FtpServerOutboundTests` and `SftpServerOutboundTests`
pinned the old position via `hasRootCauseInstanceOf(IllegalArgumentException)`,
which held only because the previous `Assert.isTrue()` left the chain empty.
* Assert the `IllegalArgumentException` and its message where they now occur in
the chain, and keep a root cause type assertion for the `FileSystemException`
that the failed creation contributes
Signed-off-by: Jiwoo Lee <dlwldn30@naver.com>1 parent fe5e7d8 commit 5666051
4 files changed
Lines changed: 82 additions & 5 deletions
File tree
- spring-integration-file/src
- main/java/org/springframework/integration/file/remote/gateway
- test/java/org/springframework/integration/file/remote/gateway
- spring-integration-ftp/src/test/java/org/springframework/integration/ftp/outbound
- spring-integration-sftp/src/test/java/org/springframework/integration/sftp/outbound
Lines changed: 8 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
23 | 23 | | |
24 | 24 | | |
25 | 25 | | |
| 26 | + | |
26 | 27 | | |
27 | 28 | | |
28 | 29 | | |
| |||
77 | 78 | | |
78 | 79 | | |
79 | 80 | | |
| 81 | + | |
80 | 82 | | |
81 | 83 | | |
82 | 84 | | |
| |||
1428 | 1430 | | |
1429 | 1431 | | |
1430 | 1432 | | |
1431 | | - | |
| 1433 | + | |
| 1434 | + | |
| 1435 | + | |
| 1436 | + | |
| 1437 | + | |
| 1438 | + | |
1432 | 1439 | | |
1433 | 1440 | | |
1434 | 1441 | | |
| |||
Lines changed: 68 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
23 | 23 | | |
24 | 24 | | |
25 | 25 | | |
| 26 | + | |
26 | 27 | | |
27 | 28 | | |
28 | 29 | | |
29 | 30 | | |
30 | 31 | | |
31 | 32 | | |
32 | 33 | | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
33 | 38 | | |
34 | 39 | | |
35 | 40 | | |
| |||
38 | 43 | | |
39 | 44 | | |
40 | 45 | | |
| 46 | + | |
41 | 47 | | |
42 | 48 | | |
43 | 49 | | |
| |||
72 | 78 | | |
73 | 79 | | |
74 | 80 | | |
| 81 | + | |
75 | 82 | | |
76 | 83 | | |
77 | 84 | | |
| |||
809 | 816 | | |
810 | 817 | | |
811 | 818 | | |
| 819 | + | |
| 820 | + | |
| 821 | + | |
| 822 | + | |
| 823 | + | |
| 824 | + | |
| 825 | + | |
| 826 | + | |
| 827 | + | |
| 828 | + | |
| 829 | + | |
| 830 | + | |
| 831 | + | |
| 832 | + | |
| 833 | + | |
| 834 | + | |
| 835 | + | |
| 836 | + | |
| 837 | + | |
| 838 | + | |
| 839 | + | |
| 840 | + | |
| 841 | + | |
| 842 | + | |
| 843 | + | |
| 844 | + | |
| 845 | + | |
| 846 | + | |
| 847 | + | |
| 848 | + | |
| 849 | + | |
| 850 | + | |
| 851 | + | |
| 852 | + | |
| 853 | + | |
| 854 | + | |
| 855 | + | |
| 856 | + | |
| 857 | + | |
| 858 | + | |
| 859 | + | |
| 860 | + | |
| 861 | + | |
| 862 | + | |
| 863 | + | |
| 864 | + | |
| 865 | + | |
| 866 | + | |
| 867 | + | |
| 868 | + | |
| 869 | + | |
| 870 | + | |
| 871 | + | |
| 872 | + | |
| 873 | + | |
| 874 | + | |
| 875 | + | |
| 876 | + | |
| 877 | + | |
| 878 | + | |
| 879 | + | |
812 | 880 | | |
813 | 881 | | |
814 | 882 | | |
| |||
Lines changed: 3 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
23 | 23 | | |
24 | 24 | | |
25 | 25 | | |
| 26 | + | |
26 | 27 | | |
27 | 28 | | |
28 | 29 | | |
| |||
211 | 212 | | |
212 | 213 | | |
213 | 214 | | |
214 | | - | |
215 | | - | |
| 215 | + | |
| 216 | + | |
216 | 217 | | |
217 | 218 | | |
218 | 219 | | |
| |||
Lines changed: 3 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
| 28 | + | |
28 | 29 | | |
29 | 30 | | |
30 | 31 | | |
| |||
191 | 192 | | |
192 | 193 | | |
193 | 194 | | |
194 | | - | |
195 | | - | |
| 195 | + | |
| 196 | + | |
196 | 197 | | |
197 | 198 | | |
198 | 199 | | |
| |||
0 commit comments