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

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

このコミットは、src/pkg/runtime/pprof/pprof_test.go ファイルに対する変更です。具体的には、Windows AMD64アーキテクチャ上のレース検出ビルド環境(windows-amd64-race ビルダー)で失敗する特定のテストをスキップするように修正が加えられています。

コミット

commit f18e2a327126904170a7d6a20b8b957b185f3954
Author: Alex Brainman <alex.brainman@gmail.com>
Date:   Thu Dec 19 14:15:57 2013 +1100

    runtime/pprof: skip tests that fail on windows-amd64-race builder
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/44180043

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

https://github.com/golang/go/commit/f18e2a327126904170a7d6a20b8b957b185f3954

元コミット内容

runtime/pprof: skip tests that fail on windows-amd64-race builder

このコミットメッセージは、runtime/pprof パッケージのテストにおいて、windows-amd64-race ビルダーで失敗するテストをスキップするように変更したことを示しています。

変更の背景

この変更の背景には、Go言語のテストインフラストラクチャにおける特定の環境でのテストの不安定性があります。コミットメッセージには「TODO(brainman): delete when issue 6986 is fixed.」というコメントが含まれており、これはGoのIssue 6986がこの問題の根本原因であることを示唆しています。

GoのIssue 6986は、「runtime/pprof: TestCPUProfileMultithreaded and TestMathBigDivide fail on windows-amd64-race」というタイトルで、windows-amd64-race ビルダー上でTestCPUProfileMultithreadedTestMathBigDivideという2つのテストが失敗するという問題が報告されています。この問題は、Goのプロファイリングツール(pprof)がマルチスレッド環境や特定の数値演算(math/bigパッケージの除算)をプロファイルする際に、Windows AMD64環境でのレース検出機能と組み合わさると、予期せぬエラーやデッドロックが発生することを示しています。

テストが継続的に失敗すると、CI/CDパイプラインがブロックされ、他の変更の検証が困難になります。そのため、一時的な措置として、問題が解決されるまでこれらのテストを特定の環境でスキップすることが決定されました。これは、CIシステムを健全に保ちつつ、根本原因のデバッグと修正に時間をかけるための一般的なプラクティスです。

前提知識の解説

このコミットを理解するためには、以下の概念が重要です。

  • Go言語のruntime/pprofパッケージ: runtime/pprofパッケージは、Goプログラムのランタイムプロファイリングデータ(CPU使用率、メモリ割り当て、ゴルーチンスタックトレースなど)を収集するための機能を提供します。開発者はこのデータを使用して、アプリケーションのパフォーマンスボトルネックを特定し、最適化を行うことができます。プロファイリングは、プログラムの実行中に特定のイベント(例: CPUクロックサイクル、関数呼び出し)をサンプリングすることで行われます。

  • Goのテストフレームワーク: Goには標準ライブラリとしてtestingパッケージが提供されており、これを用いてユニットテストやベンチマークテストを記述します。テスト関数はTestで始まり、*testing.T型の引数を取ります。t.Skip()メソッドは、特定の条件が満たされた場合にテストの実行をスキップするために使用されます。これは、環境固有の問題や未解決のバグがある場合に便利です。

  • runtime.GOOSruntime.GOARCH: runtimeパッケージは、Goプログラムが実行されているオペレーティングシステム(GOOS)とアーキテクチャ(GOARCH)に関する情報を提供します。

    • runtime.GOOS: 実行環境のOS(例: "windows", "linux", "darwin"など)。
    • runtime.GOARCH: 実行環境のCPUアーキテクチャ(例: "amd64", "arm", "386"など)。 これらの変数は、クロスプラットフォーム対応のコードや、特定の環境でのみ発生する問題を扱う際に頻繁に利用されます。
  • レース検出(Race Detector): Goには組み込みのレース検出機能があり、go run -racego build -racego test -raceなどのコマンドで有効にできます。レース検出は、複数のゴルーチンが共有データに同時にアクセスし、少なくとも1つのアクセスが書き込みである場合に発生するデータ競合(data race)を検出します。データ競合は、プログラムの動作を予測不能にし、デバッグを困難にするバグの一般的な原因です。レース検出は、実行時のインストルメンテーションによってオーバーヘッドを伴いますが、並行処理のバグを見つけるのに非常に強力なツールです。

  • windows-amd64-race ビルダー: GoプロジェクトのCI/CDシステム(特にGoの公式ビルドファーム)では、様々なOS、アーキテクチャ、およびビルドフラグの組み合わせでテストが実行されます。windows-amd64-raceは、Windowsオペレーティングシステム、AMD64アーキテクチャ、そしてレース検出が有効になっているビルド環境を指します。この特定の組み合わせでテストが失敗するということは、Windows上でのレース検出とpprofの相互作用に何らかのバグが存在することを示しています。

技術的詳細

このコミットは、Goのテストコードに条件付きスキップロジックを追加することで、特定のテストがwindows-amd64-raceビルド環境で実行されないようにしています。

変更は以下の2つのテスト関数に適用されています。

  1. TestCPUProfileMultithreaded
  2. TestMathBigDivide

これらのテスト関数は、Goのプロファイリング機能がマルチスレッド環境やmath/bigパッケージの演算で正しく動作するかを検証することを目的としています。

追加されたコードは以下の通りです。

	// TODO(brainman): delete when issue 6986 is fixed.
	if runtime.GOOS == "windows" && runtime.GOARCH == "amd64" {
		t.Skip("skipping broken test on windows-amd64-race")
	}

このコードスニペットは、テスト関数の冒頭に挿入されています。

  • runtime.GOOS == "windows": 現在の実行環境のOSがWindowsであるかをチェックします。
  • runtime.GOARCH == "amd64": 現在の実行環境のアーキテクチャがAMD64であるかをチェックします。
  • これらの条件が両方とも真である場合(つまり、Windows AMD64環境である場合)、t.Skip("skipping broken test on windows-amd64-race")が呼び出されます。

t.Skip()は、testingパッケージのメソッドで、呼び出されると現在のテストをスキップし、テストスイートの実行を続行します。スキップされたテストは、テスト結果のサマリーで「SKIP」として報告されます。引数として渡される文字列は、スキップの理由を説明するメッセージとして表示されます。

このアプローチは、テストの失敗によってCIパイプラインが停止するのを防ぎつつ、問題の存在を認識し、将来的に修正されるべき課題として残すための標準的な方法です。TODOコメントは、このスキップが一時的なものであることを明確に示しており、関連するIssue(6986)が解決された際にはこのスキップロジックを削除する必要があることを開発者に伝えています。

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

src/pkg/runtime/pprof/pprof_test.go ファイルにおいて、以下の2つのテスト関数にコードが追加されました。

  1. func TestCPUProfileMultithreaded(t *testing.T) の35行目から37行目にかけて。
  2. func TestMathBigDivide(t *testing.T) の247行目から249行目にかけて。
--- a/src/pkg/runtime/pprof/pprof_test.go
+++ b/src/pkg/runtime/pprof/pprof_test.go
@@ -33,6 +33,10 @@ func TestCPUProfile(t *testing.T) {
 }
 
 func TestCPUProfileMultithreaded(t *testing.T) {
+// TODO(brainman): delete when issue 6986 is fixed.
+if runtime.GOOS == "windows" && runtime.GOARCH == "amd64" {
+t.Skip("skipping broken test on windows-amd64-race")
+}
 	buf := make([]byte, 100000)
 	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(2))
 	testCPUProfile(t, []string{"crc32.ChecksumIEEE", "crc32.Update"}, func() {
@@ -244,6 +248,10 @@ func TestGoroutineSwitch(t *testing.T) {
 
 // Test that profiling of division operations is okay, especially on ARM. See issue 6681.
 func TestMathBigDivide(t *testing.T) {
+// TODO(brainman): delete when issue 6986 is fixed.
+if runtime.GOOS == "windows" && runtime.GOARCH == "amd64" {
+t.Skip("skipping broken test on windows-amd64-race")
+}
 	testCPUProfile(t, nil, func() {
 		t := time.After(5 * time.Second)
 		pi := new(big.Int)

コアとなるコードの解説

追加されたコードは、Goの標準ライブラリであるruntimeパッケージとtestingパッケージの機能を利用しています。

  • runtime.GOOSruntime.GOARCHは、それぞれ現在の実行環境のオペレーティングシステムとCPUアーキテクチャを示す文字列定数です。これらの値は、Goプログラムがコンパイルされた環境ではなく、実行されている環境を反映します。これにより、クロスコンパイルされたバイナリでも正確な環境情報を取得できます。
  • t.Skip(reason string)は、*testing.T型のメソッドで、このメソッドが呼び出されると、現在のテスト関数はそれ以上実行されずに終了し、テスト結果にはスキップされたことが記録されます。引数として渡された文字列は、テスト結果の出力に表示され、なぜテストがスキップされたのかを開発者に伝えます。

この変更は、特定の環境(Windows AMD64かつレース検出が有効なビルド)でのみ発生するテストの失敗を回避するための、非常に局所的かつ効果的な修正です。これにより、CIシステムが「グリーン」な状態を維持しやすくなり、開発者は根本的なバグの修正に集中できるようになります。

関連リンク

参考にした情報源リンク

このコミットは、src/pkg/runtime/pprof/pprof_test.go ファイルに対する変更です。具体的には、Windows AMD64アーキテクチャ上のレース検出ビルド環境(windows-amd64-race ビルダー)で失敗する特定のテストをスキップするように修正が加えられています。

コミット

commit f18e2a327126904170a7d6a20b8b957b185f3954
Author: Alex Brainman <alex.brainman@gmail.com>
Date:   Thu Dec 19 14:15:57 2013 +1100

    runtime/pprof: skip tests that fail on windows-amd64-race builder
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/44180043

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

https://github.com/golang/go/commit/f18e2a327126904170a7d6a20b8b957b185f3954

元コミット内容

runtime/pprof: skip tests that fail on windows-amd64-race builder

このコミットメッセージは、runtime/pprof パッケージのテストにおいて、windows-amd64-race ビルダーで失敗するテストをスキップするように変更したことを示しています。

変更の背景

この変更の背景には、Go言語のテストインフラストラクチャにおける特定の環境でのテストの不安定性があります。コミットメッセージには「TODO(brainman): delete when issue 6986 is fixed.」というコメントが含まれており、これはGoのIssue 6986がこの問題の根本原因であることを示唆しています。

GoのIssue 6986は、「runtime/pprof: TestCPUProfileMultithreaded and TestMathBigDivide fail on windows-amd64-race」というタイトルで、windows-amd64-race ビルダー上でTestCPUProfileMultithreadedTestMathBigDivideという2つのテストが失敗するという問題が報告されています。この問題は、Goのプロファイリングツール(pprof)がマルチスレッド環境や特定の数値演算(math/bigパッケージの除算)をプロファイルする際に、Windows AMD64環境でのレース検出機能と組み合わさると、予期せぬエラーやデッドロックが発生することを示しています。

テストが継続的に失敗すると、CI/CDパイプラインがブロックされ、他の変更の検証が困難になります。そのため、一時的な措置として、問題が解決されるまでこれらのテストを特定の環境でスキップすることが決定されました。これは、CIシステムを健全に保ちつつ、根本原因のデバッグと修正に時間をかけるための一般的なプラクティスです。

前提知識の解説

このコミットを理解するためには、以下の概念が重要です。

  • Go言語のruntime/pprofパッケージ: runtime/pprofパッケージは、Goプログラムのランタイムプロファイリングデータ(CPU使用率、メモリ割り当て、ゴルーチンスタックトレースなど)を収集するための機能を提供します。開発者はこのデータを使用して、アプリケーションのパフォーマンスボトルネックを特定し、最適化を行うことができます。プロファイリングは、プログラムの実行中に特定のイベント(例: CPUクロックサイクル、関数呼び出し)をサンプリングすることで行われます。

  • Goのテストフレームワーク: Goには標準ライブラリとしてtestingパッケージが提供されており、これを用いてユニットテストやベンチマークテストを記述します。テスト関数はTestで始まり、*testing.T型の引数を取ります。t.Skip()メソッドは、特定の条件が満たされた場合にテストの実行をスキップするために使用されます。これは、環境固有の問題や未解決のバグがある場合に便利です。

  • runtime.GOOSruntime.GOARCH: runtimeパッケージは、Goプログラムが実行されているオペレーティングシステム(GOOS)とアーキテクチャ(GOARCH)に関する情報を提供します。

    • runtime.GOOS: 実行環境のOS(例: "windows", "linux", "darwin"など)。
    • runtime.GOARCH: 実行環境のCPUアーキテクチャ(例: "amd64", "arm", "386"など)。 これらの変数は、クロスプラットフォーム対応のコードや、特定の環境でのみ発生する問題を扱う際に頻繁に利用されます。
  • レース検出(Race Detector): Goには組み込みのレース検出機能があり、go run -racego build -racego test -raceなどのコマンドで有効にできます。レース検出は、複数のゴルーチンが共有データに同時にアクセスし、少なくとも1つのアクセスが書き込みである場合に発生するデータ競合(data race)を検出します。データ競合は、プログラムの動作を予測不能にし、デバッグを困難にするバグの一般的な原因です。レース検出は、実行時のインストルメンテーションによってオーバーヘッドを伴いますが、並行処理のバグを見つけるのに非常に強力なツールです。

  • windows-amd64-race ビルダー: GoプロジェクトのCI/CDシステム(特にGoの公式ビルドファーム)では、様々なOS、アーキテクチャ、およびビルドフラグの組み合わせでテストが実行されます。windows-amd64-raceは、Windowsオペレーティングシステム、AMD64アーキテクチャ、そしてレース検出が有効になっているビルド環境を指します。この特定の組み合わせでテストが失敗するということは、Windows上でのレース検出とpprofの相互作用に何らかのバグが存在することを示しています。

技術的詳細

このコミットは、Goのテストコードに条件付きスキップロジックを追加することで、特定のテストがwindows-amd64-raceビルド環境で実行されないようにしています。

変更は以下の2つのテスト関数に適用されています。

  1. TestCPUProfileMultithreaded
  2. TestMathBigDivide

これらのテスト関数は、Goのプロファイリング機能がマルチスレッド環境やmath/bigパッケージの演算で正しく動作するかを検証することを目的としています。

追加されたコードは以下の通りです。

	// TODO(brainman): delete when issue 6986 is fixed.
	if runtime.GOOS == "windows" && runtime.GOARCH == "amd64" {
		t.Skip("skipping broken test on windows-amd64-race")
	}

このコードスニペットは、テスト関数の冒頭に挿入されています。

  • runtime.GOOS == "windows": 現在の実行環境のOSがWindowsであるかをチェックします。
  • runtime.GOARCH == "amd64": 現在の実行環境のアーキテクチャがAMD64であるかをチェックします。
  • これらの条件が両方とも真である場合(つまり、Windows AMD64環境である場合)、t.Skip("skipping broken test on windows-amd64-race")が呼び出されます。

t.Skip()は、testingパッケージのメソッドで、呼び出されると現在のテストをスキップし、テストスイートの実行を続行します。スキップされたテストは、テスト結果のサマリーで「SKIP」として報告されます。引数として渡される文字列は、スキップの理由を説明するメッセージとして表示されます。

このアプローチは、テストの失敗によってCIパイプラインが停止するのを防ぎつつ、問題の存在を認識し、将来的に修正されるべき課題として残すための標準的な方法です。TODOコメントは、このスキップが一時的なものであることを明確に示しており、関連するIssue(6986)が解決された際にはこのスキップロジックを削除する必要があることを開発者に伝えています。

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

src/pkg/runtime/pprof/pprof_test.go ファイルにおいて、以下の2つのテスト関数にコードが追加されました。

  1. func TestCPUProfileMultithreaded(t *testing.T) の35行目から37行目にかけて。
  2. func TestMathBigDivide(t *testing.T) の247行目から249行目にかけて。
--- a/src/pkg/runtime/pprof/pprof_test.go
+++ b/src/pkg/runtime/pprof/pprof_test.go
@@ -33,6 +33,10 @@ func TestCPUProfile(t *testing.T) {
 }
 
 func TestCPUProfileMultithreaded(t *testing.T) {
+// TODO(brainman): delete when issue 6986 is fixed.
+if runtime.GOOS == "windows" && runtime.GOARCH == "amd64" {
+t.Skip("skipping broken test on windows-amd64-race")
+}
 	buf := make([]byte, 100000)
 	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(2))
 	testCPUProfile(t, []string{"crc32.ChecksumIEEE", "crc32.Update"}, func() {
@@ -244,6 +248,10 @@ func TestGoroutineSwitch(t *testing.T) {
 
 // Test that profiling of division operations is okay, especially on ARM. See issue 6681.
 func TestMathBigDivide(t *testing.T) {
+// TODO(brainman): delete when issue 6986 is fixed.
+if runtime.GOOS == "windows" && runtime.GOARCH == "amd64" {
+t.Skip("skipping broken test on windows-amd64-race")
+}
 	testCPUProfile(t, nil, func() {
 		t := time.After(5 * time.Second)
 		pi := new(big.Int)

コアとなるコードの解説

追加されたコードは、Goの標準ライブラリであるruntimeパッケージとtestingパッケージの機能を利用しています。

  • runtime.GOOSruntime.GOARCHは、それぞれ現在の実行環境のオペレーティングシステムとCPUアーキテクチャを示す文字列定数です。これらの値は、Goプログラムがコンパイルされた環境ではなく、実行されている環境を反映します。これにより、クロスコンパイルされたバイナリでも正確な環境情報を取得できます。
  • t.Skip(reason string)は、*testing.T型のメソッドで、このメソッドが呼び出されると、現在のテスト関数はそれ以上実行されずに終了し、テスト結果にはスキップされたことが記録されます。引数として渡された文字列は、テスト結果の出力に表示され、なぜテストがスキップされたのかを開発者に伝えます。

この変更は、特定の環境(Windows AMD64かつレース検出が有効なビルド)でのみ発生するテストの失敗を回避するための、非常に局所的かつ効果的な修正です。これにより、CIシステムが「グリーン」な状態を維持しやすくなり、開発者は根本的なバグの修正に集中できるようになります。

関連リンク

参考にした情報源リンク