Project

General

Profile

Actions

Feature #20782

open

Introduction of Happy Eyeballs Version 2 (RFC8305) in TCPSocket.new

Added by shioimm (Misaki Shioi) about 2 months ago. Updated 13 days ago.

Status:
Assigned
Target version:
-
[ruby-core:119442]

Description

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, 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 .

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)

Updated by hsbt (Hiroshi SHIBATA) about 1 month ago

  • Status changed from Open to Assigned
  • Assignee set to naruse (Yui NARUSE)

Updated by hsbt (Hiroshi SHIBATA) 20 days ago

@matz (Yukihiro Matsumoto) I propose @shioimm (Misaki Shioi) 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.

Updated by tenderlovemaking (Aaron Patterson) 19 days ago

hsbt (Hiroshi SHIBATA) wrote in #note-2:

@matz (Yukihiro Matsumoto) I propose @shioimm (Misaki Shioi) 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.

+1

Updated by matz (Yukihiro Matsumoto) 14 days ago

Accepted.

Matz.

Updated by shioimm (Misaki Shioi) 14 days ago

Thank you it's honor to be a Ruby committer...!

Updated by hsbt (Hiroshi SHIBATA) 13 days ago

@shioimm (Misaki Shioi) Can you provide required/optional information at https://github.com/ruby/ruby/wiki/Committer-How-To#how-to-register-you-as-a-committer to ? After that, I will prepare your account for Ruby committer.

Updated by shioimm (Misaki Shioi) 13 days ago

@hsbt (Hiroshi SHIBATA)
I sent them to cvs-admin, thank you.

Updated by hsbt (Hiroshi SHIBATA) 13 days ago

Thanks. I've finished your accounts.

You can merge https://github.com/ruby/ruby/pull/11653 by yourself.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like1