Resilience4j: CircuitBreaker tried an illegal state transition from HALF_OPEN to HALF_OPEN

Created on 8 Oct 2019  路  4Comments  路  Source: resilience4j/resilience4j

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

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
scheduledExecutorService doesn't set isOpen false.

All 4 comments

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

Was this page helpful?
0 / 5 - 0 ratings