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

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

このコミットは、Go言語の標準ライブラリである net/http パッケージにおける、もはや使用されていない(obsoleted)ネットワークポーラーに関連するコードの残骸(dreg)を削除するものです。具体的には、テストファイル src/pkg/net/http/z_last_test.go から、net.newPollServer という文字列を含むスタックトレースのチェックを削除しています。

コミット

commit 54b2a83d9ae31bdb7a6c5aa97f7dfa219b40035d
Author: Mikio Hara <mikioh.mikioh@gmail.com>
Date:   Wed Sep 4 10:04:12 2013 +0900

    net/http: remove dreg of obsoleted network poller
    
    R=golang-dev, r
    CC=golang-dev
    https://golang.org/cl/13261049
---
 src/pkg/net/http/z_last_test.go | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/pkg/net/http/z_last_test.go b/src/pkg/net/http/z_last_test.go
index 2161db7365..5a0cc11984 100644
--- a/src/pkg/net/http/z_last_test.go
+++ b/src/pkg/net/http/z_last_test.go
@@ -23,7 +23,6 @@ func interestingGoroutines() (gs []string) {
 		}
 		stack := strings.TrimSpace(sl[1])
 		if stack == "" ||
-\t\t\tstrings.Contains(stack, "created by net.newPollServer") ||
 \t\t\tstrings.Contains(stack, "created by net.startServer") ||
 \t\t\tstrings.Contains(stack, "created by testing.RunTests") ||
 \t\t\tstrings.Contains(stack, "closeWriteAndWait") ||

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

https://github.com/golang/go/commit/54b2a83d9ae31bdb7a6c5aa97f7dfa219b40035d

元コミット内容

net/http: remove dreg of obsoleted network poller

変更の背景

Go言語のネットワーク処理は、効率的なI/O多重化を実現するために「ネットワークポーラー(netpoller)」と呼ばれるメカニズムに大きく依存しています。これは、オペレーティングシステムが提供する非同期I/O操作(Linuxのepoll、macOS/BSDのkqueue、WindowsのIOCPなど)を、Goのgoroutineが期待するブロッキングI/Oインターフェースに変換する役割を担っています。これにより、Goプログラムは多数の同時ネットワーク接続を効率的に処理し、OSスレッドの過剰な消費を防ぐことができます。

このコミットが行われた2013年9月時点では、Goのネットワークスタックは活発に開発・改善が進められていました。特にGo 1.1のリリース前後では、ネットワークポーラーとGoスケジューラの統合が深化し、ネットワーク操作におけるgoroutineのスケジューリング効率が大幅に向上しました。

コミットメッセージにある「obsoleted network poller」という表現は、ネットワークポーラーの概念そのものが廃止されたわけではなく、特定の古い実装や、もはや使用されていない内部コンポーネント、あるいはその参照がコードベースに残っていたことを示唆しています。このコミットは、そのような古い残骸をクリーンアップし、コードベースの健全性を保つことを目的としています。具体的には、net.newPollServer という文字列が、以前のネットワークポーラーの実装に関連するものであり、それがもはや存在しないか、別の方法で処理されるようになったため、テストコードからその参照を削除する必要が生じたと考えられます。

前提知識の解説

  • Go言語のネットワークポーラー (netpoller): Goランタイムの重要なコンポーネントであり、非同期I/OをブロッキングI/Oに変換します。これにより、GoのgoroutineはブロッキングI/Oを記述しながらも、実際には非同期で多数のネットワーク接続を効率的に処理できます。OS固有のI/O多重化メカニズム(epoll, kqueue, IOCPなど)を利用し、ネットワーク操作が完了するまでgoroutineをパーク(一時停止)させ、完了時に再開させます。
  • Goroutineスタックトレース: Goプログラムがパニックを起こしたり、デバッグ情報を出力したりする際に表示される、goroutineの呼び出し履歴です。どの関数がどの関数を呼び出したか、現在どの行で実行が停止しているかなどを示します。
  • strings.Contains: Goの標準ライブラリ strings パッケージの関数で、ある文字列が別の文字列に含まれているかどうかをチェックします。
  • z_last_test.go: Goのテストファイル命名規則において、z_ で始まるファイルは通常、そのパッケージのテストの最後に実行されるように意図されています。これは、特定のクリーンアップ処理や、他のテストが完了した後にのみ実行すべきテストロジックを含む場合によく用いられます。このファイルでは、interestingGoroutines() という関数が定義されており、これはテスト実行後に残っている「興味深い」goroutine(つまり、リークしている可能性のあるgoroutineや、予期せず実行中のgoroutine)を特定するために、スタックトレースを検査していると考えられます。

技術的詳細

このコミットは、src/pkg/net/http/z_last_test.go ファイル内の interestingGoroutines() 関数から、特定の文字列チェックを削除しています。

interestingGoroutines() 関数は、Goのテストフレームワークがテスト実行後に、予期せぬgoroutineのリークや、テストが終了してもバックグラウンドで実行され続けているgoroutineがないかを確認するために使用されるユーティリティ関数です。この関数は、現在実行中のすべてのgoroutineのスタックトレースを取得し、その中から「興味深い」(つまり、テストの失敗を示唆する可能性のある)goroutineをフィルタリングして返します。

削除された行は以下の通りです。

-			strings.Contains(stack, "created by net.newPollServer") ||

この行は、goroutineのスタックトレースに "created by net.newPollServer" という文字列が含まれている場合、そのgoroutineを「興味深い」ものとしてマークしない、つまり無視するという条件でした。これは、以前の net.newPollServer というコンポーネントが、テスト終了後も一時的に存在しうる正常なgoroutineを生成していたため、それを誤ってリークとして報告しないようにするための除外ルールだったと考えられます。

"remove dreg of obsoleted network poller" というコミットメッセージとこの変更を組み合わせると、以下のシナリオが考えられます。

  1. net.newPollServer の廃止: net.newPollServer という名前のネットワークポーラーの初期実装または関連コンポーネントが、Goのネットワークスタックの進化に伴い、もはや使用されなくなったか、完全に異なる実装に置き換えられました。
  2. テストのクリーンアップ: net.newPollServer が存在しなくなったため、そのコンポーネントによって作成されるgoroutineも存在しなくなりました。したがって、テストコード内でその文字列をチェックして無視する必要がなくなりました。この行を削除することで、コードベースから不要な参照が取り除かれ、テストのロジックが現在の実装に合致するように更新されました。

この変更は、Goのネットワークスタックが成熟し、内部実装が変更された結果として行われた、典型的なコードベースの保守作業と言えます。

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

src/pkg/net/http/z_last_test.go ファイルの interestingGoroutines() 関数内の一行が削除されました。

--- a/src/pkg/net/http/z_last_test.go
+++ b/src/pkg/net/http/z_last_test.go
@@ -23,7 +23,6 @@ func interestingGoroutines() (gs []string) {
 		}
 		stack := strings.TrimSpace(sl[1])
 		if stack == "" ||
-\t\t\tstrings.Contains(stack, "created by net.newPollServer") ||
 \t\t\tstrings.Contains(stack, "created by net.startServer") ||
 \t\t\tstrings.Contains(stack, "created by testing.RunTests") ||
 \t\t\tstrings.Contains(stack, "closeWriteAndWait") ||

コアとなるコードの解説

削除された行は、interestingGoroutines 関数内の if 文の条件の一部でした。この if 文は、特定の文字列がgoroutineのスタックトレースに含まれている場合に、そのgoroutineを「興味深い」リストから除外するためのものです。

元のコードでは、以下のいずれかの条件が真であれば、そのgoroutineは無視されていました。

  • stack が空文字列である。
  • stack"created by net.newPollServer" が含まれている。
  • stack"created by net.startServer" が含まれている。
  • stack"created by testing.RunTests" が含まれている。
  • stack"closeWriteAndWait" が含まれている。

このコミットにより、strings.Contains(stack, "created by net.newPollServer") の条件が削除されました。これは、net.newPollServer というコンポーネントがもはや存在しないか、その動作が変更され、テスト終了時にそのスタックトレースを持つgoroutineが残ることがなくなったため、この除外条件が不要になったことを意味します。

この変更は、テストの正確性を維持し、コードベースの整合性を保つためのクリーンアップ作業です。

関連リンク

参考にした情報源リンク