mirror of
https://gh.wpcy.net/https://github.com/discourse/discourse.git
synced 2026-05-21 01:53:41 +08:00
The current default timeout is hardcoded to 2 seconds which is proving too low for certain cases, and resulting in sporadic timeouts due to slow DNS queries.
47 lines
1.5 KiB
Ruby
Vendored
47 lines
1.5 KiB
Ruby
Vendored
# frozen_string_literal: true
|
|
|
|
describe FinalDestination::Resolver do
|
|
let(:mock_response) { [Addrinfo.ip("1.1.1.1"), Addrinfo.ip("2.2.2.2")] }
|
|
|
|
before do
|
|
# No DNS lookups in tests
|
|
Addrinfo.stubs(:getaddrinfo).never
|
|
end
|
|
|
|
def alive_thread_count
|
|
Thread.list.filter(&:alive?).count
|
|
end
|
|
|
|
it "handles timeouts correctly" do
|
|
Addrinfo.stubs(:getaddrinfo).with { |addr| sleep if addr == "sleep.example.com" } # timeout
|
|
Addrinfo.stubs(:getaddrinfo).with { |addr| addr == "example.com" }.returns(mock_response)
|
|
|
|
expect {
|
|
result = FinalDestination::Resolver.lookup("sleep.example.com", timeout: 0.001)
|
|
}.to raise_error(Timeout::Error)
|
|
|
|
start_thread_count = alive_thread_count
|
|
|
|
expect {
|
|
result = FinalDestination::Resolver.lookup("sleep.example.com", timeout: 0.001)
|
|
}.to raise_error(Timeout::Error)
|
|
|
|
expect(alive_thread_count).to eq(start_thread_count)
|
|
|
|
expect(FinalDestination::Resolver.lookup("example.com")).to eq(%w[1.1.1.1 2.2.2.2])
|
|
|
|
# Thread available for reuse after successful lookup
|
|
expect(alive_thread_count).to eq(start_thread_count + 1)
|
|
end
|
|
|
|
it "reads default query timeout from configuration" do
|
|
GlobalSetting.stubs(:dns_query_timeout_secs).returns(123)
|
|
expect(FinalDestination::Resolver.send(:default_dns_query_timeout)).to eq(123)
|
|
end
|
|
|
|
it "can lookup correctly" do
|
|
Addrinfo.stubs(:getaddrinfo).with { |addr| addr == "example.com" }.returns(mock_response)
|
|
|
|
expect(FinalDestination::Resolver.lookup("example.com")).to eq(%w[1.1.1.1 2.2.2.2])
|
|
end
|
|
end
|