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

[インデックス 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.bashrun.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.bashsrc/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と同様に、無効化の理由と再有効化の方法を説明しています。

関連リンク

参考にした情報源リンク

  • コミット情報: commit_data/18542.txt
  • GitHubコミットページ: https://github.com/golang/go/commit/9ed095bc593bd8f05b22c901975c14dca20ea7d5
  • Go言語の公式ドキュメント (レース検出器、ビルド環境変数など)
  • Bashスクリプトおよびバッチスクリプトの基本的な構文と条件分岐
  • データ競合に関する一般的なプログラミング知識
  • Goイシュートラッカーの一般的な利用方法