native resolver: consume resolutions in a loop, do not stop after the first one

this was a busy loop on dns resolution; this should utilize the socket better
This commit is contained in:
HoneyryderChuck 2025-02-27 18:56:00 +00:00
parent 723fda297f
commit 398c08eb4d
2 changed files with 29 additions and 22 deletions

View File

@ -58,22 +58,6 @@ module HTTPX
when :open
consume
end
nil
rescue Errno::EHOSTUNREACH => e
@ns_index += 1
nameserver = @nameserver
if nameserver && @ns_index < nameserver.size
log do
"resolver #{FAMILY_TYPES[@record_type]}: " \
"failed resolving on nameserver #{@nameserver[@ns_index - 1]} (#{e.message})"
end
transition(:idle)
@timeouts.clear
else
handle_error(e)
end
rescue NativeResolveError => e
handle_error(e)
end
def interests
@ -123,9 +107,34 @@ module HTTPX
end
def consume
loop do
dread if calculate_interests == :r
do_retry
dwrite if calculate_interests == :w
break unless calculate_interests == :w
# do_retry
dwrite
break unless calculate_interests == :r
end
rescue Errno::EHOSTUNREACH => e
@ns_index += 1
nameserver = @nameserver
if nameserver && @ns_index < nameserver.size
log do
"resolver #{FAMILY_TYPES[@record_type]}: " \
"failed resolving on nameserver #{@nameserver[@ns_index - 1]} (#{e.message})"
end
transition(:idle)
@timeouts.clear
retry
else
handle_error(e)
end
rescue NativeResolveError => e
handle_error(e)
close_or_resolve
retry unless closed?
end
def do_retry(loop_time = nil)
@ -475,12 +484,10 @@ module HTTPX
emit_resolve_error(connection, host, error)
end
end
close_or_resolve
end
def reset_hostname(hostname, connection: @queries.delete(hostname), reset_candidates: true)
@timeouts.delete(hostname)
@timeouts.delete(hostname)
return unless connection && reset_candidates

View File

@ -210,7 +210,7 @@ module Requests
end
self.attempts = 0
def consume
def dwrite
self.class.attempts += 1
raise Errno::EHOSTUNREACH, "host unreachable"
end