def checkout
@client.connect if !@client.connected?
start_time = Time.now
loop do
if (Time.now - start_time) > @timeout
raise ConnectionTimeoutError, "could not obtain connection within " +
"#{@timeout} seconds. The max pool size is currently #{@size}; " +
"consider increasing the pool size or timeout."
end
@connection_mutex.synchronize do
check_prune
socket = nil
if socket_for_thread = @thread_ids_to_sockets[Thread.current.object_id]
if !@checked_out.include?(socket_for_thread)
socket = checkout_existing_socket(socket_for_thread)
end
else
if @sockets.size < @size
socket = checkout_new_socket
elsif @checked_out.size < @sockets.size
socket = checkout_existing_socket
end
end
if socket
@socket_ops[socket].reject! do |op|
op.call
end
if socket.closed?
@checked_out.delete(socket)
@sockets.delete(socket)
@thread_ids_to_sockets.delete(Thread.current.object_id)
socket = checkout_new_socket
end
return socket
else
@queue.wait(@connection_mutex)
end
end
end
end