Federico Mariani created CAMEL-24094:
----------------------------------------

             Summary: camel-file: forceWrites option is dead since Camel 2.20 - 
no fsync is ever performed despite documented durability guarantee
                 Key: CAMEL-24094
                 URL: https://issues.apache.org/jira/browse/CAMEL-24094
             Project: Camel
          Issue Type: Bug
          Components: camel-file
    Affects Versions: 4.21.0
            Reporter: Federico Mariani


h3. Problem
{{forceWrites}} defaults to {{true}} and is documented as "Whether to force 
syncing writes to the file system. You can turn this off if you do not want 
this level of guarantee". The only references in camel-file main sources are 
the field/getter/setter in {{FileEndpoint}} (FileEndpoint.java:84-85, 361-371) 
- no write path in {{FileOperations}} calls {{isForceWrites()}}, 
{{FileChannel.force()}}, {{FileDescriptor.sync()}} or uses 
{{StandardOpenOption.SYNC/DSYNC}}.

h3. Failure scenario
Users relying on the advertised durability (write a file, then ack a JMS 
message / commit a consumer offset) get no fsync at all; on power loss or crash 
the "written" file can be lost or partial despite {{forceWrites=true}}.

h3. History
CAMEL-6205 added the option and wired it through {{IOHelper.close(out, name, 
LOG, endpoint.isForceWrites())}} (which called {{channel.force(true)}}). Commit 
d8c0a53b6787 ("Start using Files.newXXputStream instead of new FileXXputStream 
to reduce finalizer contention", July 2017, Camel 2.20) replaced all write 
paths with NIO ({{Files.newByteChannel}}, {{Files.copy}}, 
{{Files.newBufferedWriter}}) and dropped every {{isForceWrites()}} call - no 
JIRA, no doc/upgrade-guide change. The unused {{IOHelper.force(...)}} helpers 
still exist in core. This was collateral damage of a refactor, not an 
intentional semantics change: the option and its default were left in place and 
are still generated into the docs today.

h3. Suggested fix
Decision needed: re-wire fsync into the NIO write paths (honoring the option), 
or deprecate/remove the option with an upgrade-guide note stating the actual 
behavior since 2.20. Silently keeping a documented-but-dead durability knob is 
the worst of both.

h3. Reproducer
Not applicable - dead code is verifiable by inspection: {{grep -rn forceWrites 
components/camel-file/src/main/java}} returns only the FileEndpoint 
field/accessors.

----
_This issue was researched and filed by Claude Code on behalf of [~croway] 
(GitHub: Croway), as part of a deep code review of camel-file and camel-ftp on 
current main (4.22.0-SNAPSHOT)._



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to