Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 13101] ファイルの概要

このコミットは、Go言語の標準ライブラリnetパッケージにおけるダイヤルテストの実行時間を最適化するものです。具体的には、netbsdオペレーティングシステムを、ダイヤルテストの実行回数を削減するOSのリストに追加しています。これにより、NetBSD環境でのテストスイートの実行が高速化されます。

コミット

commit 40b310706b37b4154cae32d9ed5099dcfb80e11c
Author: Joel Sing <jsing@google.com>
Date:   Mon May 21 00:38:14 2012 +1000

    net: reduce dial tests on netbsd
    
    Add NetBSD to the list of operating systems that have a reduced set
    of dial tests.
    
    R=golang-dev, r
    CC=golang-dev
    https://golang.org/cl/6208083

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/40b310706b37b4154cae32d9ed5099dcfb80e11c

元コミット内容

net: reduce dial tests on netbsd

Add NetBSD to the list of operating systems that have a reduced set
of dial tests.

変更の背景

Go言語のネットワークパッケージ(net)には、様々なネットワーク接続の挙動を検証するためのテストが含まれています。これらのテストの中には、特定の条件下(例: ローカルホスト上のリッスンしていないポートへの接続試行)で、オペレーティングシステム(OS)のネットワークスタックの応答に時間がかかるものがあります。

以前から、darwin (macOS), freebsd, openbsd, windowsといった非Linux系のOSでは、このようなテストが完了するまでに長い時間を要することが知られていました。そのため、これらのOSではテストの反復回数を減らすことで、テストスイート全体の実行時間を短縮する最適化が施されていました。

このコミットの背景には、NetBSD環境においても同様のパフォーマンス問題が確認されたことがあります。NetBSDもまた、ローカルホスト上の非リッスンポートへの接続試行において、エラー検出やタイムアウト処理に時間がかかる特性を持っていたため、テストの実行が遅延していました。開発者は、テストの網羅性を損なうことなく、NetBSD環境での開発およびCI/CDパイプラインの効率を向上させるために、この最適化をNetBSDにも適用することを決定しました。

前提知識の解説

  • Go言語のnetパッケージ: Go言語の標準ライブラリの一部であり、TCP/UDP接続、DNSルックアップ、HTTPクライアントなど、ネットワーク通信に関する基本的な機能を提供します。アプリケーションがネットワークと対話するために不可欠なパッケージです。
  • dial_test.go: netパッケージのテストファイルの一つで、主にネットワーク接続の確立(ダイヤル)に関するテストケースが記述されています。これには、有効な接続だけでなく、接続が失敗するケース(例: 存在しないアドレスへの接続、リッスンしていないポートへの接続)のテストも含まれます。
  • runtime.GOOS: Go言語の標準ライブラリruntimeパッケージが提供する定数です。Goプログラムがコンパイルされ、実行されているオペレーティングシステムの名前(例: "linux", "darwin", "windows", "freebsd", "netbsd", "openbsd"など)を文字列で返します。これにより、OS固有の挙動に基づいてコードパスを分岐させることが可能になります。
  • ダイヤルテストの削減: ネットワーク接続のテストにおいて、特に接続失敗時のタイムアウト処理が遅いOS環境で、テストの反復回数や試行回数を減らすことを指します。これにより、テストの実行時間を短縮し、開発サイクルを高速化できます。テストの目的は、特定の挙動が正しく発生するかどうかを確認することであり、反復回数を減らしてもその目的が達成される限り、テストの品質は維持されます。
  • ローカルホスト上の非リッスンポートへの接続: ネットワークプログラミングにおいて一般的なテストシナリオの一つです。アプリケーションが、自身のマシン(ローカルホスト)上の特定のポートに接続を試みるが、そのポートで何もプログラムがリッスンしていない場合、接続は失敗します。この失敗をOSが検出し、アプリケーションにエラーを返すまでの時間は、OSの実装やネットワークスタックの構成によって大きく異なることがあります。

技術的詳細

このコミットは、src/pkg/net/dial_test.goファイル内のTestSelfConnect関数(または類似のテストロジック)に影響を与えています。このテスト関数は、おそらくローカルホストへの接続試行を複数回繰り返すことで、ネットワーク接続の挙動を検証しています。

元のコードでは、テストの反復回数を示す変数nが、デフォルトで1000に設定されていました。しかし、runtime.GOOSの値に基づいて、特定のOSではこのnの値を100に減らす条件分岐が存在していました。

	switch runtime.GOOS {
	case "darwin", "freebsd", "openbsd", "windows":
		// Non-Linux systems take a long time to figure
		// out that there is nothing listening on localhost.
		n = 100
	}

このswitch文は、darwin (macOS), freebsd, openbsd, windowsといったOSの場合にn100に設定していました。コメントにあるように、これらの非Linuxシステムでは「ローカルホストで何もリッスンしていないことを把握するのに長い時間がかかる」ためです。これは、TCP接続の確立試行がタイムアウトするまでの時間や、OSがエラーをアプリケーションに返すまでの遅延を指しています。

このコミットでは、このcase文に"netbsd"を追加しています。

--- a/src/pkg/net/dial_test.go
+++ b/src/pkg/net/dial_test.go
@@ -130,7 +130,7 @@ func TestSelfConnect(t *testing.T) {
 	\tn = 1000
 	}\n \tswitch runtime.GOOS {\
-\tcase "darwin", "freebsd", "openbsd", "windows":\
+\tcase "darwin", "freebsd", "netbsd", "openbsd", "windows":\
 \t\t// Non-Linux systems take a long time to figure\
 \t\t// out that there is nothing listening on localhost.\
 \t\tn = 100

この変更により、NetBSD環境でTestSelfConnectが実行される際も、反復回数n1000から100に削減されるようになります。これにより、NetBSD上でのテスト実行時間が大幅に短縮され、テストスイート全体の効率が向上します。テストの目的は、特定のネットワーク挙動が正しく処理されることを確認することであり、反復回数を減らしてもその本質的な検証は維持されます。これは、テストの正確性よりも、特定の環境でのテスト実行パフォーマンスを最適化するための実用的なアプローチです。

コアとなるコードの変更箇所

diff --git a/src/pkg/net/dial_test.go b/src/pkg/net/dial_test.go
index 7212087fe0..f64cc6c955 100644
--- a/src/pkg/net/dial_test.go
+++ b/src/pkg/net/dial_test.go
@@ -130,7 +130,7 @@ func TestSelfConnect(t *testing.T) {
 	\tn = 1000
 	}\n \tswitch runtime.GOOS {\
-\tcase "darwin", "freebsd", "openbsd", "windows":\
+\tcase "darwin", "freebsd", "netbsd", "openbsd", "windows":\
 \t\t// Non-Linux systems take a long time to figure\
 \t\t// out that there is nothing listening on localhost.\
 \t\tn = 100

コアとなるコードの解説

変更はsrc/pkg/net/dial_test.goファイル内のTestSelfConnect関数(またはその周辺)にあります。

このコードスニペットは、runtime.GOOS(現在のOS)の値に基づいて、テストの反復回数nを調整するswitch文を示しています。

  • 変更前: case "darwin", "freebsd", "openbsd", "windows": この行は、macOS (darwin), FreeBSD, OpenBSD, Windowsの各OSの場合に、続く処理を実行することを示しています。これらのOSでは、ローカルホスト上の非リッスンポートへの接続試行が遅いため、テストの反復回数n100に設定されていました。

  • 変更後: case "darwin", "freebsd", "netbsd", "openbsd", "windows": この行に新たに"netbsd"が追加されました。これにより、NetBSD環境でこのテストが実行される際も、他のリストされたOSと同様に、nの値が100に設定されるようになります。

この変更の目的は、NetBSD環境でのテスト実行時間を短縮することです。テストのコメントが示すように、これらの非Linuxシステムでは、ローカルホストで何もリッスンしていない状況を検出するのに時間がかかるため、テストの反復回数を減らすことで、テストスイート全体の効率を向上させています。

関連リンク

参考にした情報源リンク