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

Claus Ibsen updated CAMEL-25055:
--------------------------------
    Fix Version/s: 4.23.0

> camel-core - Error registry: fix bugs found in a deep review
> ------------------------------------------------------------
>
>                 Key: CAMEL-25055
>                 URL: https://issues.apache.org/jira/browse/CAMEL-25055
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-core
>            Reporter: Claus Ibsen
>            Assignee: Claus Ibsen
>            Priority: Major
>             Fix For: 4.23.0
>
>
> A deep review of the error registry (DefaultErrorRegistry) found the bugs 
> below. Each one was reproduced against 4.23.0-SNAPSHOT and has a test in 
> ErrorRegistryEdgeCasesTest that fails without the fix.
> Most of them come from one assumption: an exchange has at most one entry, and 
> the first one wins. The registry now only merges two captures of the same 
> failure (the same exception, or one that wraps the other), as reported by a 
> correlated copy and its original exchange (CAMEL-24863 stays covered).
> # *An error that was not handled is recorded as handled.* 
> ExchangeFailureHandledEvent means a failure processor ran, not that the 
> exception was handled: onException without handled(true), handled(false) and 
> a doCatch that throws again were all recorded as handled.
> # *A second failure of the same exchange is dropped.* After a doCatch (or 
> onException continued) recorded a handled error, a later failure that failed 
> the exchange was not recorded at all.
> # *The failures of the parts of a split replace each other.* Each part's 
> failure removed every entry of the parent exchange, so of two failed parts 
> only the last was kept (also for multicast, recipient list and seda).
> # *A failure inside onCompletion hides the failure of the route.* The 
> onCompletion copy's failure was recorded first and the route's own failure 
> was then skipped.
> # *With noErrorHandler, a failure in a route the exchange was sent to is 
> recorded with the route the exchange came from.* The node was from the 
> failing route, the route id from the first route. The route id is now taken 
> from the message history, as the node is.
> # *ErrorRegistry.forRoute(id).clear() does not reset the repeat counts of the 
> route*, as clear() of the registry does.
> # *The JMX browse of the error registry fails when two entries have the same 
> exchange id* (KeyAlreadyExistsException), as its table was indexed by 
> exchange id. It is now indexed by the uid of the entry (a new uid item). This 
> could already happen with a parallel split, and is common now that an 
> exchange can have more than one entry.
> *Not changed (for a later look)*
> * The message data of a handled error is captured after the failure processor 
> ran (so it shows the error response of onException, not the message that 
> failed), and the node of an error caught by a doCatch that throws again is 
> the node of the new throw.
> * With an error handler of a route that sent the exchange to another route, 
> the failure route id may be overwritten by the sending route 
> (captureFailureOrigin).
> _Claude Code on behalf of Claus Ibsen_



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

Reply via email to