diff options
author | Kir Shatrov <[email protected]> | 2020-08-27 08:39:13 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2020-08-27 16:39:13 +0900 |
commit | 2038cc6cab6ceeffef3ec3a765c70ae684f829ed (patch) | |
tree | c508ac47f217e759526f08b04684e96dfec2ff4d /ext/socket/rubysocket.h | |
parent | 1035a3b202ee86bf2b0a1d00eefcfff0d7ab9f6b (diff) |
Make Socket.getaddrinfo interruptible (#2827)
Before, Socket.getaddrinfo was using a blocking getaddrinfo(3) call.
That didn't allow to wrap it into Timeout.timeout or interrupt the thread in any way.
Combined with the default 10 sec resolv timeout on many Unix systems, this can
have a very noticeable effect on production Ruby apps being not
resilient to DNS outages and timing out name resolution, and being unable to fail fast even
with Timeout.timeout.
Since we already have support for getaddrinfo_a(3), the async version
of getaddrinfo, we should be able to make Socket.getaddrinfo leverage that
when getaddrinfo_a version is available in the system (hence #ifdef
HAVE_GETADDRINFO_A).
Related tickets:
https://bugs.ruby-lang.org/issues/16476
https://bugs.ruby-lang.org/issues/16381
https://bugs.ruby-lang.org/issues/14997
Notes
Notes:
Merged-By: mmasaki <[email protected]>
Diffstat (limited to 'ext/socket/rubysocket.h')
-rw-r--r-- | ext/socket/rubysocket.h | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/ext/socket/rubysocket.h b/ext/socket/rubysocket.h index fcea2a5a05..30b7a7777a 100644 --- a/ext/socket/rubysocket.h +++ b/ext/socket/rubysocket.h @@ -320,6 +320,10 @@ int rb_getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, size_ int rsock_fd_family(int fd); struct rb_addrinfo *rsock_addrinfo(VALUE host, VALUE port, int family, int socktype, int flags); struct rb_addrinfo *rsock_getaddrinfo(VALUE host, VALUE port, struct addrinfo *hints, int socktype_hack); +#ifdef HAVE_GETADDRINFO_A +struct rb_addrinfo *rsock_getaddrinfo_a(VALUE host, VALUE port, struct addrinfo *hints, int socktype_hack, VALUE timeout); +#endif + VALUE rsock_fd_socket_addrinfo(int fd, struct sockaddr *addr, socklen_t len); VALUE rsock_io_socket_addrinfo(VALUE io, struct sockaddr *addr, socklen_t len); |