shashank created CAMEL-25908:
--------------------------------

             Summary: camel-knative-http - a consumer stopped and started again 
by a route policy (circuit breaker, throttling) answers 404 for good
                 Key: CAMEL-25908
                 URL: https://issues.apache.org/jira/browse/CAMEL-25908
             Project: Camel
          Issue Type: Bug
          Components: camel-knative-http
            Reporter: shashank
            Assignee: shashank


{{KnativeHttpConsumer}} (main 74ee085f7d64) registers a Vert.x route on the 
shared platform HTTP router in {{doStart}}, only when it has none yet, and 
removes it in {{doStop}} without clearing the field:

{code:java}
protected void doStart() throws Exception {
    if (route == null) {
        ...
        route = router.get().route(HttpMethod.POST, path);
        ... handlers ...
    }
    super.doStart();
}

protected void doStop() throws Exception {
    if (route != null) {
        route.remove();
    }
    super.doStop();
}
{code}

So when the same consumer instance is stopped and started again, the start 
skips the registration: the consumer and its route report Started, but no 
handler serves its path, and every event POSTed to it is answered with 404 (the 
Knative broker or channel retries and then drops or dead-letters the events). 
It lasts until the route is restarted through the route controller (which 
creates a new consumer) or the application restarts.

The consumer is not {{Suspendable}}, so the route policies that suspend and 
resume a route stop and start this same instance 
({{RoutePolicySupport.suspendOrStopConsumer}} / {{resumeOrStartConsumer}}): the 
circuit breaker {{ThrottlingExceptionRoutePolicy}} (half open after 
{{halfOpenAfter}}), {{ThrottlingInflightRoutePolicy}}, and, with CAMEL-25848, 
the suspend/resume of the scheduled route policies. With the circuit breaker 
the circuit never closes again, since no request reaches the route. A route 
stop/start through the route controller is not affected (a new consumer is 
created), nor is a CamelContext suspend/resume. The sibling 
{{VertxPlatformHttpConsumer}} clears its routes in {{doStop}}.

*Fix*: clear {{route}} after removing it in {{doStop}}, so a start registers a 
new route.

*Tests*: two new parameterized tests in {{KnativeHttpTest}} (3 CloudEvents 
versions each, the module's platform HTTP server and two filtered sources). 
{{testConsumerStartedAgainByCircuitBreakerRoutePolicy}} (route with 
{{ThrottlingExceptionRoutePolicy(1, 60000, 1000, null)}}, one failing request 
opens the circuit and stops the consumer, the half-open task starts it again) 
and {{testConsumerStoppedAndStartedAgain}} (consumer stopped and started with 
{{ServiceHelper}}, as the policies do) fail on main: 
{{HttpOperationFailedException ... statusCode: 404}} on the request after the 
start; they pass with the fix. camel-knative-http unit tests with the fix: 200 
run, 0 failures.

*How it was found*: variant analysis of CAMEL-25872 and CAMEL-25848 (a consumer 
that is not Suspendable, started again through a path that assumes a first 
start), then the JUnit tests above.

*Affected*: main, camel-4.23.x, camel-4.22.x and camel-4.18.x (the same 
{{doStart}} guard and {{doStop}}; read, not run).

_Filed with Claude Code on behalf of allthingssecurity._




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

Reply via email to