Project

General

Profile

Actions

Feature #19965

closed

Make the name resolution interruptible

Added by mame (Yusuke Endoh) 7 months ago. Updated 4 months ago.

Status:
Closed
Target version:
-
[ruby-core:115104]

Description

Problem

Currently, Ruby name resolution is not interruptible.

$ cat /etc/resolv.conf
nameserver 198.51.100.1

$ ./local/bin/ruby -rsocket -e 'Addrinfo.getaddrinfo("www.ruby-lang.org", 80)'
^C^C^C^C

If you set a non-responsive IP as the nameserver, you cannot stop Addrinfo.getaddrinfo by pressing Ctrl+C. Note that Timeout.timeout does not work either.

This is because there is no way to cancel getaddrinfo(3).

Proposal

I wrote a patch to make getaddrinfo(3) work in a separate pthread.

https://github.com/ruby/ruby/pull/8695

Whenever it needs name resolution, it creates a worker pthread, and executes getaddrinfo(3) in it.
The caller thread waits for the worker to complete.
When an interrupt occurs, the caller thread leaves stop waiting and leaves the worker pthread.
The detached worker pthread will exit after getaddrinfo(3) completes (or name resolution times out).

Evaluation

By applying this patch, name resolution is now interruptible.

$ ./local/bin/ruby -rsocket -e 'pp Addrinfo.getaddrinfo("www.ruby-lang.org", 80)'
^C-e:1:in `getaddrinfo': Interrupt
        from -e:1:in `<main>'

As a drawback, name resolution performance will be degraded.

10000.times { Addrinfo.getaddrinfo("www.ruby-lang.org", 80) }
# Before patch: 2.3 sec.
# After ptach: 3.0 sec.

However, I think that name resolution is typically short enough for the application's runtime. For example, the difference is small for the performance of URI.open.

100.times { URI.open("https://www.ruby-lang.org").read }
# Before patch: 3.36 sec.
# After ptach: 3.40 sec.

Alternative approaches

I proposed using c-ares to resolve this issue (#19430). However, there was an opinion that it would be a problem that c-ares does not respect the platform-dependent own name resolution.

Room for improvement


Related issues 3 (1 open2 closed)

Related to Ruby master - Feature #19430: Contribution wanted: DNS lookup by c-ares libraryOpenActions
Related to Ruby master - Feature #16476: Socket.getaddrinfo cannot be interrupted by Timeout.timeoutClosedGlass_saga (Masaki Matsushita)Actions
Related to Ruby master - Bug #20172: Socket.addrinfo failing randomlyClosedActions
Actions

Also available in: Atom PDF

Like2
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0