shashank created CAMEL-25948:
--------------------------------
Summary: camel-mina-sftp - with localWorkDirectory, the local work
file of every consumed file is never deleted
Key: CAMEL-25948
URL: https://issues.apache.org/jira/browse/CAMEL-25948
Project: Camel
Issue Type: Bug
Components: camel-mina-sftp
Reporter: shashank
Assignee: shashank
With {{localWorkDirectory}}, the consumer downloads each remote file into the
local work directory and routes it as a {{java.io.File}}. The process strategy
of all file consumers
({{GenericFileProcessStrategySupport.deleteLocalWorkFile}}, called on commit,
rollback and abort) deletes the local work file named by the
{{CamelFileLocalWorkPath}} header. The sftp, ftp, ftps, smb and azure-files
operations set that header when they download into the local work directory.
{{MinaSftpOperations.retrieveFileToFileInLocalWorkDirectory}} (main
9f839f4bcc9d) does not, so:
* every file consumed by a mina-sftp endpoint stays in the local work directory
for good, also when the exchange failed. The option is meant for very big files
("to avoid loading the content into memory"), so the disk fills up with a copy
of everything the route ever consumed; a file is only replaced when a file of
the same name is consumed again;
* a file producer in the route copies the local work file to its target instead
of moving it ({{FileOperations}} renames the local work file only when the
header is set).
The migration guide presents mina-sftp as a replacement of sftp and lists no
difference for {{localWorkDirectory}}. The existing
{{MinaSftpProducerConsumerFeaturesIT.testConsumerWithLocalWorkDirectory}} only
checks the body; the sftp sibling {{SftpConsumerLocalWorkDirectoryIT}} checks
that the local work file is deleted.
*Fix*: {{MinaSftpOperations}} sets {{CamelFileLocalWorkPath}} to the local work
file before it downloads the file, as {{SftpOperations}} does.
*Behaviour change (upgrade guide entry)*: as with camel-sftp, where it is
documented, the first file producer of the route now moves the local work file,
while the message body still names it. A later step that reads the body again
(a second file producer, {{convertBodyTo}}) fails because the file is gone, and
another exchange that keeps the {{java.io.File}} body ({{wireTap}}, {{seda}}
without waiting, {{aggregate}}) finds it deleted when the exchange is done.
Such routes must convert the body first, for example with
{{convertBodyTo(byte[].class)}}.
*Tests*: new {{MinaSftpConsumerLocalWorkDirectoryIT}} (embedded SFTP server of
camel-test-infra-ftp, JUnit assertions as in the module); 4 fail on main:
* {{localWorkFileIsDeletedWhenTheExchangeCompletes}}: {{The local work file
should be deleted when the exchange is done ==> expected: <false> but was:
<true>}};
* {{localWorkFileIsDeletedWhenTheExchangeFails}}: same on rollback;
* {{localWorkFileIsMovedToTheTargetOfAFileProducer}}: the local work file is
still there after the file producer wrote its target;
* {{aSecondFileProducerFindsTheLocalWorkFileMoved}} (pins the behaviour
change): on main the second of two file producers succeeds, because the first
one copied.
A control passes on both:
{{aBodyConvertedBeforeTheFileProducerCanBeWrittenTwice}} (the workaround).
camel-mina-sftp tests and ITs with the fix: 308 run, 0 failures, 2 errors that
are the same on main ({{MinaSftpConfigurationValidationIT}} OS user / ssh
config user name fallback: the embedded server only accepts admin).
*How it was found*: differential comparison of the remote file components that
share the GenericFile / RemoteFile consumer (ftp, sftp, mina-sftp, smb,
azure-files): the operations of every sibling except mina-sftp set
{{CamelFileLocalWorkPath}} ({{SftpOperations}}, {{FtpOperations}},
{{SmbOperations}}, {{FilesOperations}}). The IT above is the evidence.
*Affected*: main, camel-4.23.x, camel-4.22.x and camel-4.18.x (the same method
without the header; read, not run).
_Filed with Claude Code on behalf of allthingssecurity._
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)