Related to 2/3 PRs I've seen on the issues list, but still seems to happen with 1.1.0.
io.github.resilience4j.circuitbreaker.IllegalStateTransitionException: CircuitBreaker 'x' tried an illegal state transition from HALF_OPEN to HALF_OPEN
at io.github.resilience4j.circuitbreaker.CircuitBreaker$StateTransition.transitionBetween(CircuitBreaker.java:476)
at io.github.resilience4j.circuitbreaker.internal.CircuitBreakerStateMachine.lambda$stateTransition$1(CircuitBreakerStateMachine.java:242)
at java.base/java.util.concurrent.atomic.AtomicReference.getAndUpdate(AtomicReference.java:187)
at io.github.resilience4j.circuitbreaker.internal.CircuitBreakerStateMachine.stateTransition(CircuitBreakerStateMachine.java:241)
at io.github.resilience4j.circuitbreaker.internal.CircuitBreakerStateMachine.transitionToHalfOpenState(CircuitBreakerStateMachine.java:270)
at io.github.resilience4j.circuitbreaker.internal.CircuitBreakerStateMachine$OpenState.tryAcquirePermission(CircuitBreakerStateMachine.java:477)
at io.github.resilience4j.circuitbreaker.internal.CircuitBreakerStateMachine.tryAcquirePermission(CircuitBreakerStateMachine.java:131)
at io.github.resilience4j.circuitbreaker.CircuitBreaker.lambda$decorateCompletionStage$1(CircuitBreaker.java:632)
at io.github.resilience4j.circuitbreaker.CircuitBreaker.executeCompletionStage(CircuitBreaker.java:317)
Could you show your CircuitBreakerConfig?
I think it caused by AutomaticTransitionFromOpenToHalfOpen.
https://github.com/resilience4j/resilience4j/blob/d6fff13432d0d359ab643d3d2ac31cad5ce669c5/resilience4j-circuitbreaker/src/main/java/io/github/resilience4j/circuitbreaker/internal/CircuitBreakerStateMachine.java#L461
scheduledExecutorService doesn't set isOpen false.
registry.circuitBreaker(
name,
CircuitBreakerConfig
.custom()
.failureRateThreshold(failureRateThreshold)
.slowCallRateThreshold(failureRateThreshold)
.slowCallDurationThreshold(
java.time.Duration.of(
slowCallDurationThreshold.length,
slowCallDurationThreshold.unit.toChronoUnit
)
)
.permittedNumberOfCallsInHalfOpenState(permittedNumberOfCallsInHalfOpenState)
.slidingWindowType(SlidingWindowType.TIME_BASED)
.slidingWindowSize(slidingWindowSize)
.minimumNumberOfCalls(
minimumNumberOfCalls.getOrElse(CircuitBreakerConfig.DEFAULT_MINIMUM_NUMBER_OF_CALLS)
)
.waitDurationInOpenState(
java.time.Duration.of(
waitDurationInOpenState.length,
waitDurationInOpenState.unit.toChronoUnit
)
)
.automaticTransitionFromOpenToHalfOpenEnabled(true).build()
)
Good finding
I will be fixed in 1.2.0
Most helpful comment
Could you show your
CircuitBreakerConfig?I think it caused by AutomaticTransitionFromOpenToHalfOpen.
https://github.com/resilience4j/resilience4j/blob/d6fff13432d0d359ab643d3d2ac31cad5ce669c5/resilience4j-circuitbreaker/src/main/java/io/github/resilience4j/circuitbreaker/internal/CircuitBreakerStateMachine.java#L461
scheduledExecutorServicedoesn't setisOpenfalse.