[インデックス 18492] ファイルの概要
このコミットは、Go言語の標準ライブラリであるnet
パッケージ内のPlan 9オペレーティングシステム向けのホスト名ルックアップ処理に関するものです。具体的には、src/pkg/net/lookup_plan9.go
ファイルが変更されています。
コミット
commit 68bf5666cdc6805783be7c29fb2a634d8d45bc24
Author: Nicolas Owens <mischief@offblast.org>
Date: Thu Feb 13 10:26:16 2014 -0500
net: only return unique hosts during hostname lookup on plan 9
TestLookupHost expects that no duplicate addresses are returned. when cs is consulted for a name, e.g net!localhost!1, it will possibly return multiple available paths, e.g. via il and tcp. this confuses the tests.
LGTM=aram
R=jas, 0intro, aram
CC=golang-codereviews
https://golang.org/cl/58120045
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/68bf5666cdc6805783be7c29fb2a634d8d45bc24
元コミット内容
net: only return unique hosts during hostname lookup on plan 9
TestLookupHost expects that no duplicate addresses are returned. when cs is consulted for a name, e.g net!localhost!1, it will possibly return multiple available paths, e.g. via il and tcp. this confuses the tests.
変更の背景
この変更の背景には、Go言語のnet
パッケージにおけるホスト名ルックアップのテスト(TestLookupHost
)が、重複するIPアドレスが返されないことを期待しているという問題がありました。しかし、Plan 9オペレーティングシステム上でホスト名を解決する際に、cs
(connection server) が同じホスト名に対して複数の利用可能なパス(例えば、il
プロトコルとtcp
プロトコル経由)を返すことがあり、これが重複したIPアドレスとしてテストに渡され、テストが失敗する原因となっていました。このコミットは、この問題を解決し、TestLookupHost
の期待に沿うように、重複しないユニークなアドレスのみを返すように修正することを目的としています。
前提知識の解説
Plan 9オペレーティングシステム
Plan 9は、ベル研究所で開発された分散オペレーティングシステムです。その設計思想は、すべてのリソースをファイルとして扱い、ファイルシステムを通じてアクセスするというものです。ネットワーク通信も例外ではなく、/net
ファイルシステムを通じて行われます。
Plan 9のネットワークとcs
(Connection Server)
Plan 9におけるネットワーク通信は、ファイルシステムを介して抽象化されています。ホスト名解決や接続確立の際には、cs
(connection server) と呼ばれるユーザーレベルのプロセスが重要な役割を果たします。クライアントがシンボリックなホスト名をアドレスに解決する必要がある場合、/net/cs
にホスト名を書き込み、cs
プロセスがその名前を接続詳細に変換し、クライアントはそれを読み取ります。
il
(Internet Layer) プロトコルとtcp
(Transmission Control Protocol)
Plan 9は、独自のトランスポートプロトコルであるIL
(Internet Layer) を持っています。これは、効率的なファイルシステムRPC (Remote Procedure Call) のために設計されています。TCPやUDPもサポートされていますが、Plan 9内部ではIL
が優先されることがあります。cs
がホスト名を解決する際、同じホスト名に対してIL
経由のパスとTCP
経由のパスの両方を返す可能性があり、これが重複アドレスの原因となります。
TestLookupHost
Go言語のnet
パッケージには、ホスト名ルックアップ機能の正確性を検証するためのテストスイートが含まれています。TestLookupHost
はその一部であり、ホスト名ルックアップの結果として返されるIPアドレスのリストが、重複を含まないユニークなものであることを期待しています。
技術的詳細
Plan 9のcs
は、ホスト名解決時に、例えばnet!localhost!1
のようなリクエストに対して、利用可能な複数のネットワークパスを返すことがあります。これは、同じ論理的なホスト名に対して、異なるプロトコル(il
やtcp
など)や異なるインターフェースを通じて到達可能な複数の経路が存在する場合に発生します。cs
はこれらの経路をすべて列挙するため、結果として同じIPアドレスが複数回リストに含まれる可能性があります。
Goのnet
パッケージのlookupHost
関数は、このcs
からの応答を処理し、IPアドレスのリストを返します。しかし、TestLookupHost
は、このリストに重複するIPアドレスが含まれていないことを前提としています。したがって、cs
が重複するアドレスを返すと、lookupHost
がそれをそのまま返してしまい、テストが失敗するという問題が発生していました。
このコミットの目的は、lookupHost
関数がPlan 9上で動作する際に、cs
から受け取ったアドレスリストから重複を排除し、ユニークなアドレスのみを返すようにすることです。これにより、TestLookupHost
の期待を満たし、テストの安定性を確保します。
コアとなるコードの変更箇所
変更はsrc/pkg/net/lookup_plan9.go
ファイルに集中しています。
--- a/src/pkg/net/lookup_plan9.go
+++ b/src/pkg/net/lookup_plan9.go
@@ -123,6 +123,7 @@ func lookupHost(host string) (addrs []string, err error) {
if err != nil {
return
}
+loop:
for _, line := range lines {
f := getFields(line)
if len(f) < 2 {
@@ -135,6 +136,12 @@ func lookupHost(host string) (addrs []string, err error) {
if ParseIP(addr) == nil {
continue
}
+ // only return unique addresses
+ for _, a := range addrs {
+ if a == addr {
+ continue loop
+ }
+ }
addrs = append(addrs, addr)
}
return
コアとなるコードの解説
このコミットのコアとなる変更は、lookupHost
関数内で、cs
から取得したアドレスをaddrs
スライスに追加する前に、そのアドレスが既にスライス内に存在するかどうかを確認するロジックを追加した点です。
-
loop:
ラベルの追加:for _, line := range lines
ループの直前にloop:
というラベルが追加されました。これは、内側のループから外側のループの次のイテレーションに直接ジャンプするために使用されます。 -
重複チェックロジックの追加: 新しいアドレス
addr
をaddrs
スライスに追加する直前に、以下のコードブロックが追加されました。// only return unique addresses for _, a := range addrs { if a == addr { continue loop } }
このコードは、現在処理しているアドレス
addr
が、既にaddrs
スライスに格納されているいずれかのアドレスa
と一致するかどうかをチェックします。- もし一致するアドレスが見つかった場合(つまり、
addr
が重複している場合)、continue loop
が実行されます。これにより、内側のfor
ループを抜け、外側のfor _, line := range lines
ループの次のイテレーションに直接進みます。結果として、重複するアドレスはaddrs
スライスに追加されません。 - 一致するアドレスが見つからなかった場合(つまり、
addr
がユニークな場合)、ループは最後まで実行され、addrs = append(addrs, addr)
によってaddr
がスライスに追加されます。
- もし一致するアドレスが見つかった場合(つまり、
この変更により、lookupHost
関数は、Plan 9のcs
が重複するアドレスを返した場合でも、最終的にTestLookupHost
が期待するようなユニークなIPアドレスのリストのみを返すようになります。
関連リンク
- Go CL 58120045: https://golang.org/cl/58120045
参考にした情報源リンク
- Plan 9のネットワークと
cs
(Connection Server) について:- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEH3UDZ6A3tb_G4j7K7oZRTTsp4ThIUl4XP0JndVfjk3ecVcy2rBrBm6o_tM017W75wrt1lxrdgAqCOnh5zYyvhdSyk9mY_j2yeqhcnR3lWcF4HduJw_opYIbZ8NW_i72KrvGLU-ovTcsExWcfExdlS
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFY0hMtjbbcJHxU66onG0MMlSnjk5sJ2PBgoAzyFHV6zqaWsQQYN2lqkQgrnzNT-FfwENORk-0bUP59i0sB8dIvuc2HJe6ej2Jc0RLikYiwrATspPw8bokojHhP
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEU49UEHKVPAP25fS79fT4tGpy9CVUlRNO8NE69mMR5BALXHmCXjc8ZMkQv7DArrhz3OcGuKu4d4-HrtfLkhlYfI-CJ3TXsZaWNJZpW_jObUOUW7_A2SiIhdLGe41bwi3Q5UTFDJcgwpHBdEShoc=
- Plan 9の
ndb
(Network Database) とDNS解決について:- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGwVGSbUUXWxQxUJtkdgYZtwVyXkVme37HbnXkdyjNzkyL5S8h4v69GYdI7kHsqUwl5o_G3CBYCFzaNlbZ3pB_QWnCPs84AM8IEntfw77AgAGbMbkNEPjm0aVd0hEsjqMzCko9Qdro8XX08qtHgXLkuxkvw
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFXfUH1MOlhZcP5In42fJXQu4e-M3-w5cxNkAchkEFDXfFaFWk22tPsN04_dxHdKsXsDN-SCgaoheEFs10g3tpuyqPQTHncv8dJO1ghRD5i9El1Z51Ubhne9TBc6PbzSXGIZmpFAAdFxuoQIpkwi_QJqjysugY=
- Plan 9の
IL
プロトコルについて: - Plan 9の全体的なネットワークアプローチ: