class Connfuse::Circuit

Attributes

expected_errors[R]
failure_count[R]
last_error[R]
last_failed_at[R]
limit[R]
status[R]
timeout[R]

Public Class Methods

new(timeout: 15, limit: 5, expected_errors: []) click to toggle source
# File lib/connfuse/circuit.rb, line 13
def initialize(timeout: 15, limit: 5, expected_errors: [])
  @timeout = timeout
  @expected_errors = expected_errors
  @limit = limit
  @failure_count = 0
  @status = :loaded
  @mutex = Mutex.new

  @expected_errors << CircuitError
end

Public Instance Methods

break!() click to toggle source
# File lib/connfuse/circuit.rb, line 32
def break!
  @mutex.lock
  @status = :broken
  @mutex.unlock
end
broken?() click to toggle source
# File lib/connfuse/circuit.rb, line 28
def broken?
  :broken == status
end
load!() click to toggle source
# File lib/connfuse/circuit.rb, line 38
def load!
  @mutex.lock
  @status = :loaded
  @failure_count = 0
  @mutex.unlock
end
loaded?() click to toggle source
# File lib/connfuse/circuit.rb, line 24
def loaded?
  :loaded == status
end
pass_thru() { || ... } click to toggle source
# File lib/connfuse/circuit.rb, line 54
def pass_thru
  raise CircuitError if broken? && too_soon?
  yield
rescue => e
  register_failure(e)
  break! if failure_count > limit
  raise e
end
register_failure(error) click to toggle source
# File lib/connfuse/circuit.rb, line 45
def register_failure(error)
  return if expected_errors.include? error
  @mutex.lock
  @failure_count += 1
  @last_error = error
  @last_failed_at = Time.now
  @mutex.unlock
end

Private Instance Methods

too_soon?() click to toggle source
# File lib/connfuse/circuit.rb, line 65
def too_soon?
  Time.now < (last_failed_at + limit)
end