ruby-core@ruby-lang.org archive (unofficial mirror)
 help / color / mirror / Atom feed
From: "hsbt (Hiroshi SHIBATA) via ruby-core" <ruby-core@ml.ruby-lang.org>
To: ruby-core@ml.ruby-lang.org
Cc: "hsbt (Hiroshi SHIBATA)" <noreply@ruby-lang.org>
Subject: [ruby-core:119665] [Ruby master Feature#20782] Introduction of Happy Eyeballs Version 2 (RFC8305) in TCPSocket.new
Date: Fri, 01 Nov 2024 01:57:37 +0000 (UTC)	[thread overview]
Message-ID: <redmine.journal-110321.20241101015736.24749@ruby-lang.org> (raw)
In-Reply-To: <redmine.issue-20782.20241004055701.24749@ruby-lang.org>

Issue #20782 has been updated by hsbt (Hiroshi SHIBATA).


@matz I propose @shioimm as a Ruby committer. She is best person to maintain HEv2 and Socket related feature. It's good time to commit https://github.com/ruby/ruby/pull/11653 by herself.

I'll support and mentor her.

----------------------------------------
Feature #20782: Introduction of Happy Eyeballs Version 2 (RFC8305) in TCPSocket.new
https://bugs.ruby-lang.org/issues/20782#change-110321

* Author: shioimm (Misaki Shioi)
* Status: Assigned
* Assignee: naruse (Yui NARUSE)
----------------------------------------
This is an implementation of Happy Eyeballs version 2 (RFC 8305) in `TCPSocket.new`.
See https://github.com/ruby/ruby/pull/11653

### Background
Prior to this implementation, I implemented Happy Eyeballs Version 2 (HEv2) for `Socket.tcp` in https://github.com/ruby/ruby/pull/9374. 
HEv2 is an algorithm defined in [RFC 8305](https://datatracker.ietf.org/doc/html/rfc8305), aimed at improving network connectivity. 
For more details on the specific cases that HEv2 helps, please refer to https://bugs.ruby-lang.org/issues/20108.

### Proposal & Outcome
This proposal implements the same HEv2 algorithm in `TCPSocket.new`.
Since `TCPSocket.new` is used more widely than `Socket.tcp`, this change is expected to broaden the impact of HEv2's benefits. 
Like `Socket.tcp`, I have also added `fast_fallback` keyword argument to `TCPSocket.new`. 
This option is set to true by default, enabling the HEv2 functionality. 
However, users can explicitly set it to false to disable HEv2 and use the previous behavior of `TCPSocket.new`.

It should be noted that HEv2 is enabled only in environments where pthreads are available.
This specification follows the approach taken in https://bugs.ruby-lang.org/issues/19965, where name resolution can be interrupted. 
(In environments where pthreads are not available, the `fast_fallback` option is ignored.)

### Performance
Below is the benchmark of 100 requests to `www.ruby-lang.org` with the fast_fallback option set to true and false, respectively. 
While there is a slight performance degradation when HEv2 is enabled, the degradation is smaller compared to that seen in `Socket.tcp` .

```ruby
require 'socket'
require 'benchmark'

hostname = "www.ruby-lang.org"
port = 80
n = 100

Benchmark.bmbm do |x|
  x.report("fast_fallback: true") do
    n.times { TCPSocket.new(hostname, port).close }
  end

  x.report("fast_fallback: false") do
    n.times { TCPSocket.new(hostname, port, fast_fallback: false).close }
  end
end
```

```
~/s/build ❯❯❯ ../install/bin/ruby ../ruby/test.rb
Rehearsal --------------------------------------------------------
fast_fallback: true    0.017588   0.097045   0.114633 (  1.460664)
fast_fallback: false   0.014033   0.078984   0.093017 (  1.413951)
----------------------------------------------- total: 0.207650sec

                           user     system      total        real
fast_fallback: true    0.020891   0.124054   0.144945 (  1.473816)
fast_fallback: false   0.018392   0.110852   0.129244 (  1.466014)
```



-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

  parent reply	other threads:[~2024-11-01  1:57 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-04  5:57 [ruby-core:119442] " shioimm (Misaki Shioi) via ruby-core
2024-10-08  2:18 ` [ruby-core:119478] " hsbt (Hiroshi SHIBATA) via ruby-core
2024-11-01  1:57 ` hsbt (Hiroshi SHIBATA) via ruby-core [this message]
2024-11-01 23:30 ` [ruby-core:119685] " tenderlovemaking (Aaron Patterson) via ruby-core
2024-11-06  2:11 ` [ruby-core:119762] " mame (Yusuke Endoh) via ruby-core
2024-11-06  9:03 ` [ruby-core:119770] " matsuda (Akira Matsuda) via ruby-core
2024-11-07  9:43 ` [ruby-core:119795] " matz (Yukihiro Matsumoto) via ruby-core
2024-11-07 10:03 ` [ruby-core:119797] " shioimm (Misaki Shioi) via ruby-core
2024-11-08  0:21 ` [ruby-core:119829] " hsbt (Hiroshi SHIBATA) via ruby-core
2024-11-08  3:58 ` [ruby-core:119831] " shioimm (Misaki Shioi) via ruby-core
2024-11-08  4:32 ` [ruby-core:119833] " hsbt (Hiroshi SHIBATA) via ruby-core

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=redmine.journal-110321.20241101015736.24749@ruby-lang.org \
    --to=ruby-core@ml.ruby-lang.org \
    --cc=noreply@ruby-lang.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).