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