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

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

このコミットは、Go言語のランタイムにおけるデータ競合検出器(Race Detector)のテストが、FreeBSDオペレーティングシステム上でも実行されるようにrun.bashスクリプトを更新するものです。これにより、FreeBSD環境での並行処理のバグ検出能力が向上し、Goのクロスプラットフォームサポートが強化されます。

コミット

commit a668114834b67db2da4ce467487a2b87ff9ca50e
Author: Dmitriy Vyukov <dvyukov@google.com>
Date:   Fri Jun 20 20:54:18 2014 -0400

    run.bash: run race tests on freebsd
    
    LGTM=dave
    R=golang-codereviews, dave
    CC=golang-codereviews
    https://golang.org/cl/102580043

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

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

元コミット内容

run.bash: run race tests on freebsd

LGTM=dave
R=golang-codereviews, dave
CC=golang-codereviews
https://golang.org/cl/102580043

変更の背景

Go言語のデータ競合検出器は、並行処理を行うプログラムにおける潜在的なバグ(データ競合)を特定するための強力なツールです。この検出器は、これまでLinuxとOS X(macOS)のamd64アーキテクチャでのみ公式にサポートされ、テストが実行されていました。しかし、Goはクロスプラットフォームを強く意識しており、FreeBSDも重要なターゲットOSの一つです。FreeBSD環境でGoアプリケーションを開発・実行するユーザーにとって、データ競合検出器が利用可能であることは、信頼性の高いソフトウェアを構築する上で不可欠です。

このコミットは、FreeBSD上でのデータ競合検出器のテストを有効にすることで、FreeBSD環境におけるGoランタイムの安定性と品質を保証することを目的としています。これにより、FreeBSDユーザーもGoの並行処理における潜在的な問題を早期に発見し、修正できるようになります。

前提知識の解説

  • Go Race Detector (データ競合検出器): Goのデータ競合検出器は、Go 1.1で導入された組み込みのツールで、並行処理を行うプログラムにおけるデータ競合(data race)を検出します。データ競合とは、複数のゴルーチンが同時に同じメモリ位置にアクセスし、少なくとも1つのアクセスが書き込みであり、かつそれらのアクセスが同期メカニズムによって保護されていない場合に発生するバグです。データ競合は、プログラムの予測不能な動作、クラッシュ、データの破損などを引き起こす可能性があり、デバッグが非常に困難です。GoのRace Detectorは、実行時にプログラムのメモリアクセスを監視し、データ競合のパターンを検出すると警告を出力します。go test -raceコマンドを使用することで、テスト実行中にデータ競合を検出できます。これは、開発者が並行処理のバグを早期に発見し、修正するための非常に強力なメカニズムです。

  • FreeBSD: FreeBSDは、UNIXライクなオープンソースのオペレーティングシステムです。高性能、安定性、セキュリティに優れており、サーバー、組み込みシステム、デスクトップなど幅広い用途で利用されています。Go言語は、LinuxやmacOSと同様にFreeBSDも主要なサポート対象プラットフォームとしており、GoアプリケーションがFreeBSD上でネイティブに動作するように設計されています。

  • run.bash: run.bashは、Goプロジェクトのルートディレクトリにあるシェルスクリプトで、Goのテストスイートを実行するために使用されます。このスクリプトは、ユニットテスト、インテグレーションテスト、特定の機能テストなど、Goランタイムや標準ライブラリの品質を保証するための様々なテストを自動化します。Goプロジェクトの継続的インテグレーション(CI)システムにおいて、このスクリプトは非常に重要な役割を担っており、変更がGoの動作に悪影響を与えないことを確認するために広範囲なテストを実行します。データ競合検出器のテストもこのスクリプトの一部として実行されます。

  • go test -race: Goのテストコマンドgo test-raceフラグを付けることで、データ競合検出器を有効にしてテストを実行できます。このフラグを使用すると、Goランタイムは特別なインストゥルメンテーション(計測コードの挿入)を有効にし、メモリアクセスを監視してデータ競合を検出します。検出された競合は、ファイル名、行番号、スタックトレースなどの詳細情報とともに報告され、開発者が問題の箇所を特定しやすくなります。

  • Go環境変数 (GOHOSTOS, GOOS, GOARCH, CGO_ENABLED): Goのビルドシステムは、クロスコンパイルや特定の環境設定を制御するために、いくつかの重要な環境変数を使用します。

    • GOHOSTOS: Goツールチェインが動作しているホストオペレーティングシステム(例: linux, darwin, freebsd)。
    • GOOS: ビルド対象のオペレーティングシステム(例: linux, darwin, freebsd)。
    • GOARCH: ビルド対象のCPUアーキテクチャ(例: amd64, arm64)。
    • CGO_ENABLED: Cgo(GoとC言語の相互運用機能)が有効になっているかどうかを示すフラグ(1は有効、0は無効)。Goのデータ競合検出器は、内部的にC言語のランタイムライブラリに依存しているため、CGO_ENABLED=1である必要があります。 これらの変数の組み合わせによって、特定のプラットフォーム向けのビルドやテストの挙動が制御され、run.bashのようなスクリプトはこれらの値を利用して適切なテストパスを選択します。

技術的詳細

このコミットの技術的な変更は、src/run.bashスクリプト内の条件分岐ロジックを修正することに集約されます。データ競合検出器のテストを実行するかどうかを決定するcaseステートメントに、FreeBSD環境の条件が追加されました。

具体的には、run.bashスクリプトは、GOHOSTOS, GOOS, GOARCH, CGO_ENABLEDというGoの環境変数の組み合わせを評価し、データ競合検出器のテストがサポートされているプラットフォームであるかどうかを判断します。このコミット以前は、サポートされる組み合わせとしてlinux-linux-amd64-1(Linuxホスト/ターゲット、amd64アーキテクチャ、Cgo有効)とdarwin-darwin-amd64-1(macOSホスト/ターゲット、amd64アーキテクチャ、Cgo有効)のみが明示的にリストされていました。

今回の変更では、このリストにfreebsd-freebsd-amd64-1が追加されました。これにより、run.bashスクリプトがFreeBSD上のamd64アーキテクチャでCgoが有効な状態で実行された場合でも、データ競合検出器のテストが自動的に実行されるようになります。これは、GoのテストインフラストラクチャがFreeBSD環境でのデータ競合検出器の動作を検証するための重要なステップであり、FreeBSDにおけるGoの並行処理の信頼性を高めることに貢献します。

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

--- a/src/run.bash
+++ b/src/run.bash
@@ -64,10 +64,10 @@ echo
 echo '# sync -cpu=10'
 go test sync -short -timeout=$(expr 120 \* $timeout_scale)s -cpu=10
 
-# Race detector only supported on Linux and OS X,
+# Race detector only supported on Linux, FreeBSD and OS X,
 # and only on amd64, and only when cgo is enabled.
 case "$GOHOSTOS-$GOOS-$GOARCH-$CGO_ENABLED" in
-linux-linux-amd64-1 | darwin-darwin-amd64-1)
+linux-linux-amd64-1 | freebsd-freebsd-amd64-1 | darwin-darwin-amd64-1)
 	echo
 	echo '# Testing race detector.'
 	go test -race -i runtime/race flag

コアとなるコードの解説

変更されたコードは、src/run.bashスクリプト内のcaseステートメントの一部です。このcaseステートメントは、Goの環境変数GOHOSTOS, GOOS, GOARCH, CGO_ENABLEDを結合した文字列(例: linux-linux-amd64-1)を評価し、データ競合検出器のテストを実行すべきかどうかを判断します。

元のコードでは、データ競合検出器のテストを実行する条件として、以下の2つのパターンのみが明示的に定義されていました。

  • linux-linux-amd64-1: ホストOSがLinux、ターゲットOSがLinux、アーキテクチャがamd64、Cgoが有効な場合。
  • darwin-darwin-amd64-1: ホストOSがmacOS (darwin)、ターゲットOSがmacOS (darwin)、アーキテクチャがamd64、Cgoが有効な場合。

このコミットでは、上記の行に| freebsd-freebsd-amd64-1が追加されました。

  • |: シェルスクリプトのcaseステートメントにおける論理OR演算子です。これにより、複数のパターンの中からいずれか一つにマッチすれば、対応するコードブロックが実行されます。
  • freebsd-freebsd-amd64-1: この新しいパターンは、ホストOSがFreeBSD、ターゲットOSがFreeBSD、アーキテクチャがamd64、Cgoが有効であるという条件を表します。

この変更により、run.bashスクリプトがFreeBSD上のamd64環境でCgoが有効な状態で実行された場合でも、データ競合検出器のテストがトリガーされるようになります。これは、GoのテストインフラストラクチャがFreeBSD環境でのデータ競合検出器の動作を検証するための重要なステップであり、Goのクロスプラットフォーム互換性と信頼性を向上させるための継続的な取り組みの一環です。

関連リンク

参考にした情報源リンク

  • Go Race Detectorの公式ドキュメント
  • FreeBSDの公式ウェブサイト
  • Go言語の環境変数に関する公式ドキュメント