Class: RubyLlmMesh::CircuitBreaker

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby_llm_mesh/circuit_breaker.rb,
sig/ruby_llm_mesh.rbs

Overview

Simple per-provider circuit breaker shared across the process.

Constant Summary collapse

OPEN =
:open
CLOSED =
:closed
HALF_OPEN =
:half_open

Instance Method Summary collapse

Constructor Details

#initialize(failure_threshold:, reset_timeout:) ⇒ CircuitBreaker

Returns a new instance of CircuitBreaker.



10
11
12
13
14
15
# File 'lib/ruby_llm_mesh/circuit_breaker.rb', line 10

def initialize(failure_threshold:, reset_timeout:)
  @failure_threshold = failure_threshold
  @reset_timeout = reset_timeout
  @states = Hash.new { |h, k| h[k] = { failures: 0, opened_at: nil, state: CLOSED } }
  @mutex = Mutex.new
end

Instance Method Details

#allow?(provider) ⇒ Boolean

Parameters:

  • (Symbol)

Returns:

  • (Boolean)


17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/ruby_llm_mesh/circuit_breaker.rb', line 17

def allow?(provider)
  @mutex.synchronize do
    entry = @states[provider]
    case entry[:state]
    when CLOSED
      true
    when OPEN
      if Time.now - entry[:opened_at] >= @reset_timeout
        entry[:state] = HALF_OPEN
        true
      else
        false
      end
    when HALF_OPEN
      true
    end
  end
end

#record_failure(provider) ⇒ void

This method returns an undefined value.

Parameters:

  • (Symbol)


42
43
44
45
46
47
48
49
50
51
# File 'lib/ruby_llm_mesh/circuit_breaker.rb', line 42

def record_failure(provider)
  @mutex.synchronize do
    entry = @states[provider]
    entry[:failures] += 1
    if entry[:failures] >= @failure_threshold || entry[:state] == HALF_OPEN
      entry[:state] = OPEN
      entry[:opened_at] = Time.now
    end
  end
end

#record_success(provider) ⇒ void

This method returns an undefined value.

Parameters:

  • (Symbol)


36
37
38
39
40
# File 'lib/ruby_llm_mesh/circuit_breaker.rb', line 36

def record_success(provider)
  @mutex.synchronize do
    @states[provider] = { failures: 0, opened_at: nil, state: CLOSED }
  end
end

#reset!(provider = nil) ⇒ void

This method returns an undefined value.

Parameters:

  • (Symbol, nil)


57
58
59
60
61
62
63
64
65
# File 'lib/ruby_llm_mesh/circuit_breaker.rb', line 57

def reset!(provider = nil)
  @mutex.synchronize do
    if provider
      @states.delete(provider)
    else
      @states.clear
    end
  end
end

#state_for(provider) ⇒ Symbol

Parameters:

  • (Symbol)

Returns:

  • (Symbol)


53
54
55
# File 'lib/ruby_llm_mesh/circuit_breaker.rb', line 53

def state_for(provider)
  @mutex.synchronize { @states[provider][:state] }
end