Guillaume Nodet created CAMEL-24267:
---------------------------------------
Summary: ThrottlingInflightRoutePolicy.setResumePercentOfMax has
writer-side race condition
Key: CAMEL-24267
URL: https://issues.apache.org/jira/browse/CAMEL-24267
Project: Camel
Issue Type: Improvement
Components: camel-core
Reporter: Guillaume Nodet
Found during review of PR #24985 (CAMEL-24227: volatile sweep for JMX-writable
fields). The PR introduced {{ThrottlingLimits}} immutable holder records to fix
*reader-side* tearing, but *writer-side* atomicity remains unaddressed.
h3. Problem
{{setResumePercentOfMax(int)}} reads {{this.maxInflightExchanges}} to compute
the resume value, then publishes a new {{ThrottlingLimits}} holder. Two
concurrent JMX writers calling {{setResumePercentOfMax}} and
{{setMaxInflightExchanges}} simultaneously can each read the other's stale
value, producing a holder built from a mixed snapshot.
{code:java}
public void setResumePercentOfMax(int resumePercentOfMax) {
this.resumePercentOfMax = resumePercentOfMax;
// reads maxInflightExchanges — but another writer may be changing it
concurrently
int resume = (int) (maxInflightExchanges * resumePercentOfMax / 100.0);
this.throttlingLimits = new ThrottlingLimits(maxInflightExchanges, resume);
}
{code}
h3. Suggested fix
Synchronize the writer methods, or use a compare-and-swap loop on the volatile
holder reference to ensure the snapshot is consistent.
h3. References
* PR [#24985|https://github.com/apache/camel/pull/24985] review comment by
oscerd
*
{{core/camel-core-processor/src/main/java/org/apache/camel/processor/ThrottlingInflightRoutePolicy.java}}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)