class MultiThink::Connection
Constants
- DEFAULTS
Public Class Methods
new(options = {})
click to toggle source
# File lib/multithink/connection.rb, line 15 def initialize(options = {}) options = DEFAULTS.merge(options) @servers = options.fetch(:servers) @retries = options.fetch(:retries) @retry_interval = options.fetch(:retry_interval) @conn_timeout = options.fetch(:conn_timeout) connect end
Public Instance Methods
connect()
click to toggle source
# File lib/multithink/connection.rb, line 24 def connect @tried = 0 while @tried < @retries do @servers.each do |server| begin #TODO(jpg) make timeout configurable Timeout::timeout(@conn_timeout) do @conn = r.connect(server) end return true rescue sleep @retry_interval end @tried += 1 end end # If we got here we couldn't get a connection. :( raise "Error: Reached maximum retries (#{@retries})" end
is_connection_error(e)
click to toggle source
# File lib/multithink/connection.rb, line 54 def is_connection_error(e) case e when Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::EPIPE, Errno::ECONNRESET, Errno::ETIMEDOUT, IOError true when RethinkDB::RqlRuntimeError e.message =~ /cannot perform (read|write): No master available/ || e.message =~ /Error: Connection Closed/ else false end end
reconnect()
click to toggle source
# File lib/multithink/connection.rb, line 67 def reconnect begin # try fast path first @conn.reconnect rescue # if that fails then try get a new connection connect end end
run(query, *args)
click to toggle source
# File lib/multithink/connection.rb, line 44 def run(query, *args) begin query.run(@conn, *args) rescue StandardError => e if is_connection_error(e) retry if reconnect end end end