[ 
https://issues.apache.org/jira/browse/CAMEL-26768?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Work on CAMEL-26768 started by shashank.
----------------------------------------
> camel-sanitizer - rule R2: each consumer commit runs exactly once
> -----------------------------------------------------------------
>
>                 Key: CAMEL-26768
>                 URL: https://issues.apache.org/jira/browse/CAMEL-26768
>             Project: Camel
>          Issue Type: Improvement
>          Components: camel-core
>            Reporter: shashank
>            Assignee: shashank
>            Priority: Major
>
> Step 3 of the order of work in the exchange sanitizer design 
> ({{design/exchange-sanitizer.adoc}}, CAMEL-26630), second part: rule R2 in 
> {{camel-sanitizer}} (CAMEL-26714), on the on completion listener SPI of 
> CAMEL-26742.
> *The rule* (as the design and the Javadoc of {{Synchronization}} state it): 
> each commit of a consumer, the on completion it adds to the exchange before 
> it routes it (such as the file consumer moving the file), runs {{onComplete}} 
> or {{onFailure}} exactly once, where it is held at the end; and while it is 
> in a unit of work it moves only by a handover of the exchange that unit of 
> work was created for. In the sanitizer the commits of an exchange are the on 
> completions it holds when it gets the unit of work created for it; on 
> completions added later are not commits.
> *What R2 reports* (new kinds of {{Violation}}):
> * {{COMMIT_RUN_TWICE}}: a commit runs again, for one add (such as a unit of 
> work done twice, or a commit run where it was handed over from and again by 
> the copy it went to). Reported before the second run, with the thread and 
> stack of both runs.
> * {{COMMIT_HANDED_OVER_BY_OTHER_EXCHANGE}}: a commit handed over through a 
> unit of work by an exchange it was not created for, such as a part that 
> shares the unit of work of its parent and is sent to {{seda}} (CAMEL-26576). 
> Reported at the handover, before the commit runs with the outcome of the 
> copy, with the step that runs on that thread.
> * {{COMMIT_HANDED_OVER_TWICE}}: a commit handed over again from a unit of 
> work it already left, as when two parts hand over at the same time 
> (CAMEL-26569).
> * {{COMMIT_NEVER_RUN}}: the exchange of the unit of work is done and the 
> commit was neither run, handed over nor taken out; or the context stops while 
> the commit waits in a copy that was never routed (such as a {{seda}} queue 
> without a consumer).
> The design's third report, two handovers that overlap in time seen with a 
> watch window, is checked by its outcome instead (a commit handed over twice, 
> run twice or never): since CAMEL-26569 the unit of work takes each on 
> completion out under its lock, so an overlap alone is not a violation, and no 
> watch window (the sampling of R3) is needed. The design text is updated.
> *How*
> * An {{OnCompletionListener}} that follows each add of a commit by the 
> identity of its on completion (one on completion can be on many exchanges), 
> in a table that keeps no exchange: a weak map of the units of work (holding 
> the id of the exchange each was created for) and a bounded map (10 000) of 
> the commits that wait in exchanges without a unit of work, such as copies in 
> a {{seda}} queue. Past the bound the oldest is no longer followed; one WARN 
> and the report say so.
> * An {{EventNotifier}} for exchange completed and failed only, for "never 
> ran".
> * The step listener of R1 tells R2 which step runs on a thread, so a report 
> names the step that handed the commit over.
> * {{camel.sanitizer.checks}} gets {{commit}}; the default is 
> {{callback,commit}} (camel-main option).
> * A unit of work of a user that does not tell what it hands over (the default 
> of {{UnitOfWork.handoverSynchronizationWithResult(target, filter)}}) or does 
> not report its adds is not checked for commits that never run. Commits taken 
> out as a list ({{handoverCompletions()}}, as {{seda}} does with 
> {{multipleConsumers}}) are checked for running once only.
> *Validation* (as the design asks, before it is proposed): the fixes of 
> CAMEL-26576 and CAMEL-26569 reverted and R2 reports each at the right point; 
> a custom consumer whose commit runs twice fails its test with a report that 
> names its class; the camel-core suite with {{-Psanitizer}} reports nothing 
> from R2 outside the tests that break the rule on purpose; a TLA+ model of the 
> records (commit run, handover and done on different threads) shows no false 
> report and no missed violation.
> Builds on CAMEL-26742 (the on completion listener SPI, merged).
> _Filed with Claude Code on behalf of allthingssecurity._



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to