failsafe-lib / failsafe

Fault tolerance and resilience patterns for the JVM
https://failsafe.dev
Apache License 2.0
4.16k stars 295 forks source link

CircuitBreaker stays in OPEN even after DELAY time #378

Open epischel opened 5 months ago

epischel commented 5 months ago

I configure a CircuitBreaker with a delay. I expect to transition from OPEN to HALFOPEN after delay-time given that nothing gets recorded. It does not happen. Code to observe this behaviour:

  public static void main(String[] args) throws InterruptedException {
    final CircuitBreaker<Object> circuitBreaker =
        CircuitBreaker.builder()
            .withFailureThreshold(3)
            .withSuccessThreshold(3)
            .withDelay(Duration.ofMinutes(2))
            .build();
    // bring to OPEN state
    circuitBreaker.recordFailure();
    circuitBreaker.recordFailure();
    circuitBreaker.recordFailure();
    circuitBreaker.recordFailure();
    // print state every 10 seconds
    for (int i = 0; i < 4 * 6; i++) {
      System.out.println(LocalDateTime.now());
      System.out.println(circuitBreaker.getState());
      System.out.println(circuitBreaker.getRemainingDelay());
      Thread.sleep(10_000L);
    }
  }

Is this intended behaviour?

williamroberts commented 5 months ago

I would also appreciate an understanding of why the CircuitBreaker never appears to change state in this scenario.