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

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

このコミットは、Go言語のランタイムパッケージ (src/pkg/runtime) に関連するテストファイル parfor_test.go の変更です。このファイルは、Goランタイムにおける並列処理のパフォーマンスと正確性を検証するためのテストコードを含んでいます。具体的には、TestParForParallel というテスト関数が対象となっています。

コミット

このコミットは、以前に一時的に無効化されていた TestParForParallel テストを再有効化するものです。これは、テストが以前に検出していた根本的な問題が解決されたと判断されたためです。

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

https://github.com/golang/go/commit/7c7d22ac5f29c610d6e0f781370c3e44c8443f69

元コミット内容

runtime: re-enable TestParForParallel

See how it flies. We'll disable it again if the underlying issue is not resolved.
See issue 4155 for details.

Fixes #4155.

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/13368045

変更の背景

TestParForParallel テストは、以前、特定のアーキテクチャ(amd64 以外)で一時的に無効化されていました。これは、http://golang.org/issue/4155 で詳細が議論されている、並列処理に関する未解決の問題が存在したためです。このコミットは、その根本的な問題が解決されたと判断されたため、テストを再有効化し、その動作を監視する目的で行われました。もし問題が再発するようであれば、再度テストを無効化する可能性も示唆されています。

前提知識の解説

Go言語のテストフレームワーク

Go言語には、標準ライブラリとして testing パッケージが提供されており、これを用いてユニットテストやベンチマークテストを記述します。テスト関数は Test で始まり、引数として *testing.T を受け取ります。

t.Parallel()

*testing.T 型の t.Parallel() メソッドは、そのテスト関数が他の並列テストと並行して実行できることをテストランナーに通知します。t.Parallel() が呼び出されると、テストランナーはそのテストの実行を一時停止し、パッケージ内のすべての非並列テストが完了するのを待ちます。その後、t.Parallel() を呼び出したすべてのテストが並行して実行されます。これにより、I/OバウンドなテストやCPUバウンドなテストの実行時間を大幅に短縮できます。

GOARCH 環境変数

GOARCH はGo言語のビルドシステムで使用される環境変数で、ターゲットとするアーキテクチャ(例: amd64, arm, 386 など)を指定します。Goのコード内でこの環境変数の値にアクセスすることで、特定のアーキテクチャに依存する処理を条件分岐させることができます。

amd64 アーキテクチャ

amd64 は、AMD64命令セットアーキテクチャを指します。これは、Intelのx86-64命令セットと互換性があり、現代のほとんどのデスクトップPCやサーバーで使用されている64ビットプロセッサのアーキテクチャです。

技術的詳細

このコミットの技術的な変更は非常にシンプルです。TestParForParallel 関数内に存在していた、GOARCHamd64 ではない場合にテストをスキップする条件分岐が削除されました。

元のコードでは、GOARCH != "amd64" という条件が真の場合、t.Log で一時的な無効化のメッセージを出力し、return でテストの実行を終了していました。これにより、amd64 以外のアーキテクチャでは TestParForParallel が実行されないようになっていました。

このコミットによってこの条件分岐が削除されたため、TestParForParallel はすべてのアーキテクチャで実行されるようになります。これは、以前 amd64 以外のアーキテクチャで発生していた並列処理に関する問題が解決されたという確信に基づいています。

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

--- a/src/pkg/runtime/parfor_test.go
+++ b/src/pkg/runtime/parfor_test.go
@@ -102,11 +102,6 @@ func TestParForSetup(t *testing.T) {
 
 // Test parallel parallelfor.
 func TestParForParallel(t *testing.T) {
-\tif GOARCH != "amd64" {
-\t\tt.Log("temporarily disabled, see http://golang.org/issue/4155")
-\t\treturn
-\t}\n-\n \tN := uint64(1e7)
 \tif testing.Short() {
 \t\tN /= 10

コアとなるコードの解説

変更されたのは src/pkg/runtime/parfor_test.go ファイル内の TestParForParallel 関数です。

削除されたコードは以下の5行です。

	if GOARCH != "amd64" {
		t.Log("temporarily disabled, see http://golang.org/issue/4155")
		return
	}

このコードブロックは、GOARCH 環境変数の値が "amd64" ではない場合に、テストをスキップするためのものでした。

  • if GOARCH != "amd64": 現在のビルドターゲットアーキテクチャが amd64 ではないかをチェックします。
  • t.Log("temporarily disabled, see http://golang.org/issue/4155"): テストが一時的に無効化されていることをログに出力し、関連するIssue番号を提示します。
  • return: テスト関数の実行をここで終了させ、それ以降のテストロジックが実行されないようにします。

これらの行が削除されたことにより、TestParForParallelGOARCH の値に関わらず常に実行されるようになります。これは、以前 amd64 以外のアーキテクチャで発生していた並列処理のバグや不安定性が修正されたことを意味します。

関連リンク

  • Go Issue 4155 (コミットメッセージに記載されているが、公開されているGoのIssueトラッカーでは直接見つからない可能性あり): http://golang.org/issue/4155
  • Go CL 13368045: https://golang.org/cl/13368045 (GoのコードレビューシステムであるGerritの変更リストへのリンク)

参考にした情報源リンク