[
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)