def checkout
@client.connect if !@client.connected?
start_time = Time.now
loop do
@connection_mutex.synchronize do
if socket_for_thread = thread_local[:sockets][self.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_local[:sockets].delete self.object_id
socket = checkout_new_socket
end
return socket
else
@queue.wait(@connection_mutex)
end
end
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
end
end