class RedisClient::CircuitBreaker

def protect

def protect
  if @state == :open
    refresh_state
  end
  case @state
  when :open
    raise OpenCircuitError, "Too many connection errors happened recently"
  when :closed
    begin
      yield
    rescue ConnectionError
      record_error
      raise
    end
  when :half_open
    begin
      result = yield
      record_success
      result
    rescue ConnectionError
      record_error
      raise
    end
  else
    raise "[BUG] RedisClient::CircuitBreaker unexpected @state (#{@state.inspect}})"
  end
end