[インデックス 18542] ファイルの概要
このコミットは、Go言語のビルドシステムにおけるレース検出器(Race Detector)のテストに関する変更です。具体的には、Windows環境でのレース検出器テストを無効化する修正が含まれています。
コミット
commit 9ed095bc593bd8f05b22c901975c14dca20ea7d5
Author: Russ Cox <rsc@golang.org>
Date: Sat Feb 15 20:03:41 2014 -0500
build: disable race detector test in run.bat on windows
CL 64170043 disabled it in run.bash for Unix systems.
I did not realize Windows systems also ran the race detector test.
TBR=iant
CC=golang-codereviews
https://golang.org/cl/64480043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/9ed095bc593bd8f05b22c901975c14dca20ea7d5
元コミット内容
build: disable race detector test in run.bat on windows
CL 64170043 disabled it in run.bash for Unix systems.
I did not realize Windows systems also ran the race detector test.
TBR=iant
CC=golang-codereviews
https://golang.org/cl/64480043
変更の背景
このコミットの背景には、Go言語のビルドおよびテストプロセスにおけるレース検出器の挙動があります。以前のコミット(CL 64170043)では、Unix系システム(run.bash
スクリプトを使用)において、特定のGoイシュー(golang.org/issue/7334
)が原因でレース検出器のテストが無効化されていました。
コミットメッセージによると、コミッターであるRuss Cox氏は、Windowsシステムでもレース検出器のテストが実行されていることを認識していなかったようです。この認識不足により、Unix系システムで無効化されたテストがWindowsでは引き続き実行され、おそらく同じイシュー(golang.org/issue/7334
)に起因する問題が発生していたと考えられます。
したがって、このコミットの目的は、Unix系システムと同様に、Windows環境においてもレース検出器のテストを一時的に無効化し、ビルドプロセスの安定性を確保することにあります。これは、未解決のバグや互換性の問題がテストの失敗を引き起こすことを防ぐための措置です。
前提知識の解説
Go言語のレース検出器 (Race Detector)
Go言語には、並行処理におけるデータ競合(data race)を検出するための組み込みツールである「レース検出器」が提供されています。データ競合とは、複数のゴルーチンが同時に同じメモリ位置にアクセスし、少なくとも1つのアクセスが書き込みであり、かつそれらのアクセスが同期メカニズムによって順序付けされていない場合に発生するバグです。データ競合は予測不能なプログラムの挙動やクラッシュを引き起こす可能性があり、デバッグが非常に困難です。
Goのレース検出器は、プログラムの実行時にメモリアクセスを監視し、データ競合のパターンを検出します。go test -race
コマンドを使用することで、テスト実行中にレース検出器を有効にできます。検出器は、競合が検出された場合に詳細なレポート(スタックトレースなど)を出力し、開発者が問題を特定し修正するのを助けます。
run.bash
と run.bat
これらはGoプロジェクトのテストスイートを実行するためのスクリプトファイルです。
run.bash
: Unix系システム(Linux, macOSなど)で使用されるBashスクリプトです。run.bat
: Windowsシステムで使用されるバッチスクリプトです。
これらのスクリプトは、Goの標準ライブラリやランタイムのテストを自動化するために使用され、様々なテストコマンド(go test
)や設定が含まれています。
golang.org/issue/7334
これはGoのイシュートラッカーにおける特定のバグ報告です。コミットメッセージから、このイシューがレース検出器のテストに関連する問題を示していることが推測されます。具体的な内容はコミットメッセージからは分かりませんが、レース検出器が特定の条件下で誤動作したり、テストが失敗したりする原因となっていた可能性があります。このようなイシューが存在するため、一時的にレース検出器のテストを無効化する必要がありました。
GOHOSTOS
, GOOS
, GOARCH
, CGO_ENABLED
これらはGoのビルド環境に関する環境変数です。
GOHOSTOS
: Goツールチェインが動作しているホストOS。GOOS
: ビルド対象のOS。GOARCH
: ビルド対象のアーキテクチャ。CGO_ENABLED
: Cgo(GoとC言語の相互運用機能)が有効になっているかどうかを示すフラグ(1: 有効、0: 無効)。
レース検出器はCgoに依存しており、特定のOSとアーキテクチャの組み合わせでのみサポートされます(例: Linux/amd64, macOS/amd64)。これらの環境変数は、スクリプト内でレース検出器のテストを実行するかどうかを条件分岐するために使用されます。
技術的詳細
このコミットは、Goのビルドスクリプトであるsrc/run.bash
とsrc/run.bat
に修正を加えています。
src/run.bash
の変更点
Unix系システム向けのrun.bash
スクリプトでは、既にレース検出器のテストが無効化されていました。このコミットでは、コメントが更新され、Windowsのrun.bat
でも同様の変更が必要であることが明記されています。
--- a/src/run.bash
+++ b/src/run.bash
@@ -57,7 +57,8 @@ go test sync -short -timeout=$(expr 120 \* $timeout_scale)s -cpu=10
# Race detector only supported on Linux and OS X,
# and only on amd64, and only when cgo is enabled.
-# Disabled due to golang.org/issue/7334; remove XXX below to reenable.
+# Disabled due to golang.org/issue/7334; remove XXX below
+# and in run.bat to reenable.
case "$GOHOSTOS-$GOOS-$GOARCH-$CGO_ENABLED" in
XXXlinux-linux-amd64-1 | XXXdarwin-darwin-amd64-1)
echo
元のコメントでは「XXXを削除して再有効化する」とだけ書かれていましたが、新しいコメントでは「run.bat
のXXXも削除して再有効化する」と追記され、Windowsスクリプトとの同期が強調されています。
src/run.bat
の変更点
Windowsシステム向けのrun.bat
スクリプトが主な変更対象です。
--- a/src/run.bat
+++ b/src/run.bat
@@ -52,7 +52,11 @@ go test sync -short -timeout=120s -cpu=10
if errorlevel 1 goto fail
echo.
-if not "%GOHOSTOS%-%GOOS%-%GOARCH%-%CGO_ENABLED%" == "windows-windows-amd64-1" goto norace
+# Race detector only supported on Linux and OS X,
+# and only on amd64, and only when cgo is enabled.
+# Disabled due to golang.org/issue/7334; remove XXX below
+# and in run.bash to reenable.
+if not "%GOHOSTOS%-%GOOS%-%GOARCH%-%CGO_ENABLED%" == "XXXwindows-windows-amd64-1" goto norace
echo # Testing race detector.
go test -race -i runtime/race flag
if errorlevel 1 goto fail
変更前は、以下の条件でレース検出器のテストが実行されていました。
if not "%GOHOSTOS%-%GOOS%-%GOARCH%-%CGO_ENABLED%" == "windows-windows-amd64-1" goto norace
これは、「ホストOSがWindows、ターゲットOSがWindows、アーキテクチャがamd64、Cgoが有効」という条件に一致しない場合にnorace
ラベルにジャンプし、レース検出器のテストをスキップするという意味です。つまり、この条件に一致する場合(Windows/Windows/amd64/Cgo有効)にテストが実行されていました。
変更後、条件文字列の先頭にXXX
が追加されました。
if not "%GOHOSTOS%-%GOOS%-%GOARCH%-%CGO_ENABLED%" == "XXXwindows-windows-amd64-1" goto norace
これにより、%GOHOSTOS%-%GOOS%-%GOARCH%-%CGO_ENABLED%
の値がXXXwindows-windows-amd64-1
と完全に一致することは通常ありえなくなります。結果として、このif
文の条件は常に真となり、goto norace
が実行され、レース検出器のテストが常にスキップされるようになります。
このXXX
プレフィックスは、意図的に条件を不一致にさせることで、テストを無効化するための一般的な慣用句です。将来的にイシューが解決された際に、このXXX
を削除することで簡単にテストを再有効化できるようになっています。
また、run.bat
にもrun.bash
と同様のコメントが追加され、レース検出器のサポート状況と、golang.org/issue/7334
のためにテストが無効化されていることが明記されました。
コアとなるコードの変更箇所
src/run.bash
: コメントの更新src/run.bat
: レース検出器テストの条件分岐にXXX
プレフィックスを追加し、コメントを更新
コアとなるコードの解説
src/run.bash
# Race detector only supported on Linux and OS X,
# and only on amd64, and only when cgo is enabled.
# Disabled due to golang.org/issue/7334; remove XXX below
# and in run.bat to reenable.
case "$GOHOSTOS-$GOOS-$GOARCH-$CGO_ENABLED" in
XXXlinux-linux-amd64-1 | XXXdarwin-darwin-amd64-1)
# ... レース検出器テストの実行ロジック ...
;;
esac
この部分では、case
文を使ってGOHOSTOS-GOOS-GOARCH-CGO_ENABLED
の組み合わせをチェックしています。XXX
プレフィックスが付いているため、このcase
文の条件は常に偽となり、レース検出器のテストは実行されません。コメントは、この無効化がgolang.org/issue/7334
によるものであり、run.bat
でも同様の変更が必要であることを示しています。
src/run.bat
# Race detector only supported on Linux and OS X,
# and only on amd64, and only when cgo is enabled.
# Disabled due to golang.org/issue/7334; remove XXX below
# and in run.bash to reenable.
if not "%GOHOSTOS%-%GOOS%-%GOARCH%-%CGO_ENABLED%" == "XXXwindows-windows-amd64-1" goto norace
echo # Testing race detector.
go test -race -i runtime/race flag
if errorlevel 1 goto fail
:norace
この部分では、if not ... == "XXX..." goto norace
という条件分岐が使われています。XXX
プレフィックスにより、この条件は常に真となり、norace
ラベルにジャンプしてレース検出器のテスト(go test -race ...
)をスキップします。これにより、Windows環境でのレース検出器テストが実質的に無効化されます。コメントはrun.bash
と同様に、無効化の理由と再有効化の方法を説明しています。
関連リンク
- Go Issue 7334: https://github.com/golang/go/issues/7334 (このコミットの背景にある具体的な問題の詳細が記載されている可能性があります)
- Go Race Detector Documentation: https://go.dev/doc/articles/race_detector (Goのレース検出器に関する公式ドキュメント)
参考にした情報源リンク
- コミット情報:
commit_data/18542.txt
- GitHubコミットページ: https://github.com/golang/go/commit/9ed095bc593bd8f05b22c901975c14dca20ea7d5
- Go言語の公式ドキュメント (レース検出器、ビルド環境変数など)
- Bashスクリプトおよびバッチスクリプトの基本的な構文と条件分岐
- データ競合に関する一般的なプログラミング知識
- Goイシュートラッカーの一般的な利用方法