[
https://issues.apache.org/jira/browse/CAMEL-25778?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18128680#comment-18128680
]
Guillaume Nodet commented on CAMEL-25778:
-----------------------------------------
This issue is being investigated by a coding agent (on behalf of gnodet).
The race condition has been confirmed in the code: in
GenericFileConsumer.isValidFile(), after the in-progress repository removes the
file entry (in GenericFileOnCompletion.onCompletion()), the poll thread can add
the file back and route it a second time. The suggested fix (checking file
existence after adding to in-progress) is well-scoped for a single PR.
_Note: This comment was generated by an AI coding agent and requires manual
verification._
> camel-file - the consumer can route a file twice when the exchange is
> completed on another thread
> -------------------------------------------------------------------------------------------------
>
> Key: CAMEL-25778
> URL: https://issues.apache.org/jira/browse/CAMEL-25778
> Project: Camel
> Issue Type: Bug
> Components: camel-file
> Reporter: Urmila Unni
> Assignee: Guillaume Nodet
> Priority: Major
>
> When a route hands the exchange off to another thread after a file consumer
> (an async delay, threads, seda or disruptor), the exchange is committed on
> that thread while the file consumer keeps polling. A poll can then route a
> file a second time after it was already moved:
> 1. the poll lists the directory while the file is still there,
> 2. another thread commits the exchange: GenericFileOnCompletion moves the
> file (for example to .camel) and then removes it from the in-progress
> repository,
> 3. the poll reaches the in-progress check in GenericFileConsumer.isValidFile
> for that file after the removal, so the check passes and the already-moved
> file is routed again. Its commit then fails with "Cannot rename file".
> Found while fixing CAMEL-25647 (FileDisruptorShutdownCompleteAllTasksTest: a
> file route with an async delay(1000) to a disruptor endpoint). Log of one
> failing run, for b.txt:
> {noformat}
> 12.619 [disruptor://foo] Done processing file: GenericFile[b.txt]
> 12.637 [disruptor://foo] Renaming file: GenericFile[b.txt] to:
> GenericFile[.camel\b.txt]
> 12.663 [arget/disruptor] Took 41ms to poll: target\disruptor
> 12.663 [arget/disruptor] Total 1 files to consume
> 12.667 [arget/disruptor] About to process file: GenericFile[b.txt]
> 13.685 [disruptor://foo] WARN Error during commit ... Cannot rename file:
> GenericFile[b.txt] to: GenericFile[.camel\b.txt]
> {noformat}
> The poll that picked up b.txt the second time took 41 ms, so it started at
> about 12.622, before the rename at 12.637.
> Possible fix, suggested in the review of
> https://github.com/apache/camel/pull/28039: check that the file still exists
> after it was added to the in-progress repository.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)