2023年度Rubyアソシエーション開発助成 「socketライブラリへのHappy Eyeballs Version 2 (RFC8305)の導入」 メンター報告書 # プロジェクト概要 本プロジェクトは、Rubyの標準添付ライブラリであるsocketライブラリをHappy Eyeballs Version 2 (RFC8305)に対応させることを目標としている。 現在のインターネットはIPv4とIPv6が併存する移行期にあり、IPv4とIPv6のどちらかが使えなかったり遅かったりすることがある。そのような環境でも、両者の名前解決や接続試行を並列に行うことで、より素早く接続することができる。Happy Eyeballsではその際に用いるアルゴリズムを定義している。 # プロジェクトの背景 本プロジェクトに先行して、2020年度のRubyアソシエーション開発助成にて松下正樹氏により同様のプロジェクトが行われた。当該プロジェクトではいくつかの実装が行われたが、その過程で以下のような技術上の課題が発見された。 * IPv6の名前解決、IPv4の名前解決、接続試行を同時に待つ必要があること * 非同期かつ中断可能なgetaddrinfo実装が必要であるが、glibcのgetaddrinfo_aでは実装上の問題があること 前者は当該プロジェクトの過程で解決策が見出され、後者は本プロジェクトの開始前にmame氏によって割り込み可能なgetaddrinfoのための実装が開発・マージされた。[[Feature #19965]](https://bugs.ruby-lang.org/issues/19965) # 計画の達成状況 上述の通り、プロジェクト開始時点で、その大枠としての技術的課題と解決方法は概ね存在することが知られていたが、実装が複雑になることも想定されていたため、まずアルゴリズムの理解を深めつつ擬似コードをまとめることにした。その後にスレッドの操作をRubyで行えるSocket.tcpを実装し、同時に細部の仕様を議論し、最後にCでの実装が必要となるTCPSocket.newを実装することとした。 実装に際しては、名前解決の際のエラー時にユーザーに通知すべきエラーと無視すべきエラーは何についてかの検討を行った。また、テストに際してはモックやテスト用のダミー実装の用意をしている。 Socket.tcpのマージに際しては、Happy Eyeballsなしの場合のベストケースに比べて遅くなることがある点について議論が行われた。ここでの議論での結論は、TCPSocket.newのマージに際しても流用できると思われる。 最終的に3月末において、Socket.tcpは実装が完了し、Rubyのmasterブランチにマージされた。TCPSocket.newは一旦の実装は完了したが、マージに向けて改善を行っているところである。 # まとめ 本プロジェクトでは、TCPを扱うsocketライブラリのメソッドであるSocket.tcpとTCPSocket.newについて、Happy Eyeballs 2に対応させることを目標とした。Socket.tcpは実装が完了し、マージが行われた。TCPSocket.newはPull Requestは作成されていないが、主要な実装は行われており、主な仕様上の議論はSocket.tcpマージの時点で行われているので、今後のマージが期待される。