Skip to content

Commit 6ae4a59

Browse files
committed
Replace Timeout.timeout with socket timeout
Timeout.timeout is inefficient since it spins up a new thread for each invocation, use Socket.tcp's connect_timeout option instead
1 parent e4bbf95 commit 6ae4a59

File tree

1 file changed

+7
-4
lines changed

1 file changed

+7
-4
lines changed

lib/net/smtp.rb

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -575,7 +575,12 @@ def finish
575575
private
576576

577577
def tcp_socket(address, port)
578-
TCPSocket.open address, port
578+
begin
579+
Socket.tcp address, port, nil, nil, connect_timeout: @open_timeout
580+
rescue Errno::ETIMEDOUT #raise Net:OpenTimeout instead for compatibility with previous versions
581+
raise Net::OpenTimeout, "Timeout to open TCP connection to "\
582+
"#{address}:#{port} (exceeds #{@open_timeout} seconds)"
583+
end
579584
end
580585

581586
def do_start(helo_domain, user, secret, authtype)
@@ -584,9 +589,7 @@ def do_start(helo_domain, user, secret, authtype)
584589
check_auth_method(authtype || DEFAULT_AUTH_TYPE)
585590
check_auth_args user, secret
586591
end
587-
s = Timeout.timeout(@open_timeout, Net::OpenTimeout) do
588-
tcp_socket(@address, @port)
589-
end
592+
s = tcp_socket(@address, @port)
590593
logging "Connection opened: #{@address}:#{@port}"
591594
@socket = new_internet_message_io(tls? ? tlsconnect(s, @ssl_context_tls) : s)
592595
check_response critical { recv_response() }

0 commit comments

Comments
 (0)