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

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

このコミットは、Goプロジェクトのダッシュボード(misc/dashboard)におけるビルダーステータスの表示方法に関する変更です。具体的には、Goのレース検出器(Race Detector)が有効になっているビルド環境("race" ビルダー)の表示を改善し、アーキテクチャ情報よりもレース検出器の利用を優先して表示するように修正しています。これにより、ダッシュボード上でレース検出器が有効なビルドがより明確に識別できるようになります。

コミット

  • コミットハッシュ: 15790204768b9cbea056150e530d4c39d2e62b47
  • 作者: Dmitriy Vyukov dvyukov@google.com
  • コミット日時: 2013年6月26日 水曜日 21:20:53 +0400

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

https://github.com/golang/go/commit/15790204768b9cbea056150e530d4c39d2e62b47

元コミット内容

    misc/dashboard: show all race builders as "race"
    race is more important than arch (moreover race implies x64)
    don't know how to test it
    
    R=golang-dev, dave, r
    CC=golang-dev
    https://golang.org/cl/10484046

変更の背景

Goプロジェクトでは、様々なプラットフォームや設定(例: レース検出器の有効/無効)でコードがビルドされ、テストされます。これらのビルドの状態は、Goダッシュボードと呼ばれるウェブインターフェースで可視化されています。

このコミット以前は、レース検出器が有効なビルド環境(通称「race builder」)が、そのアーキテクチャ(例: linux-amd64-race)を含んだ形で表示されていました。しかし、コミットメッセージにあるように、「レース検出器が有効であること」は、そのビルドが特定の種類のバグ(データ競合)を検出するために特化しているという点で、単なるアーキテクチャ情報(例: amd64)よりも重要であると判断されました。

また、レース検出器は通常、64ビットアーキテクチャ(x64またはamd64)上で動作するため、raceというタグ自体が暗黙的にx64を意味するという背景もありました。

この変更の目的は、ダッシュボードの表示をより簡潔かつ情報量が多くなるように改善し、レース検出器が有効なビルドを「race」という統一された短いタグで表示することでした。これにより、開発者は一目でレース検出器が有効なビルドのステータスを把握できるようになります。

前提知識の解説

Go Dashboard (Goビルドダッシュボード)

Goプロジェクトは、継続的インテグレーション(CI)システムを使用して、様々なオペレーティングシステム、アーキテクチャ、Goのバージョン、および特定のビルド設定(例: レース検出器の有効化)でコードが正しくビルドされ、テストがパスすることを確認しています。Go Dashboardは、これらのCIジョブの結果を集約し、ウェブインターフェースで表示するシステムです。開発者はこのダッシュボードを通じて、Goのソースコードに対する変更が、様々な環境でどのような影響を与えるかを一目で確認できます。各ビルド環境は「ビルダー」と呼ばれ、それぞれが特定の構成(例: linux-amd64-race, windows-386)を持っています。

Go Race Detector (Goレース検出器)

Goのレース検出器は、Go 1.1で導入された強力なツールで、並行処理におけるデータ競合(data race)を検出するために使用されます。データ競合は、複数のゴルーチンが同時に同じメモリ位置にアクセスし、少なくとも1つのアクセスが書き込みであり、かつそれらのアクセスが同期メカニズムによって保護されていない場合に発生します。データ競合は、プログラムの予測不能な動作やクラッシュの原因となることがあり、デバッグが非常に困難です。

レース検出器は、プログラムの実行時にメモリアクセスを監視し、データ競合のパターンを検出すると警告を出力します。Goプログラムをビルドする際に、-raceフラグをgo buildgo testコマンドに渡すことで有効にできます(例: go build -race myapp.go)。レース検出器を有効にすると、プログラムの実行速度は低下しますが、並行処理のバグを見つける上で非常に価値があります。

ビルダー文字列の命名規則

Goダッシュボードで使用されるビルダー文字列は、通常、{OS}-{ARCH}[-variant]のような形式で、特定のビルド環境を識別します。

  • OS: オペレーティングシステム(例: linux, windows, darwin
  • ARCH: CPUアーキテクチャ(例: amd64, 386, arm
  • variant: 特定のビルド設定や特性(例: race for race detector, longtest for long-running tests)

例えば、linux-amd64-raceは「Linux上でAMD64アーキテクチャを使用し、レース検出器が有効なビルド」を意味します。

技術的詳細

このコミットは、misc/dashboard/app/build/ui.goファイル内のbuilderArchShort関数を変更しています。この関数は、与えられたビルダー文字列(例: linux-amd64-race)から、ダッシュボードに表示するための短いアーキテクチャタグを生成する役割を担っています。

変更前は、builderArchShort関数は特定の文字列"linux-amd64-race"と完全に一致する場合にのみ"race"を返していました。これは、レース検出器が有効なビルドを識別するための非常に限定的な条件でした。

変更後は、strings.Contains関数を使用して、ビルダー文字列が-race-という部分文字列を含んでいるかどうかをチェックするように汎用化されました。ここで重要なのは、チェック対象の文字列をs+"-"としている点です。これは、ビルダー文字列が"linux-amd64-race"のように-raceで終わる場合でも、-race-というパターンにマッチさせるための工夫です。例えば、"linux-amd64-race""-"を追加すると"linux-amd64-race-"となり、この文字列は-race-を含みます。これにより、linux-amd64-raceだけでなく、将来的にwindows-amd64-raceや他のOS/アーキテクチャの組み合わせでレース検出器が有効なビルダーが追加された場合でも、適切に"race"タグが適用されるようになります。

この変更により、builderArchShort関数は、特定のアーキテクチャに依存せず、レース検出器が有効なすべてのビルダーに対して一貫して"race"という短いタグを返すことができるようになりました。

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

--- a/misc/dashboard/app/build/ui.go
+++ b/misc/dashboard/app/build/ui.go
@@ -211,7 +211,7 @@ func builderArch(s string) string {
 
 // builderArchShort returns a short arch tag for a builder string
 func builderArchShort(s string) string {
-	if s == "linux-amd64-race" {
+	if strings.Contains(s+"-", "-race-") {
 		return "race"
 	}
 	arch := builderArch(s)

コアとなるコードの解説

変更されたのは、misc/dashboard/app/build/ui.goファイル内のbuilderArchShort関数です。

  • 変更前:

    if s == "linux-amd64-race" {
        return "race"
    }
    

    このコードは、入力されたビルダー文字列sが厳密に"linux-amd64-race"と一致する場合にのみ、"race"という短いアーキテクチャタグを返していました。これは非常に限定的であり、例えばwindows-amd64-raceのような他のレース検出器が有効なビルダーには対応できませんでした。

  • 変更後:

    if strings.Contains(s+"-", "-race-") {
        return "race"
    }
    

    この変更により、条件が大幅に汎用化されました。

    • s+"-": 入力されたビルダー文字列sの末尾にハイフン-を追加しています。これは、"linux-amd64-race"のように-raceで終わる文字列が、次のstrings.Containsチェックで-race-というパターンにマッチするようにするための巧妙なテクニックです。例えば、"linux-amd64-race""linux-amd64-race-"となり、この文字列は-race-を含みます。
    • strings.Contains(..., "-race-"): Goの標準ライブラリstringsパッケージのContains関数を使用しています。この関数は、第一引数の文字列が第二引数の部分文字列を含んでいる場合にtrueを返します。ここでは、ビルダー文字列(末尾に-を追加したもの)が-race-という部分文字列を含んでいるかどうかをチェックしています。

この変更により、linux-amd64-raceだけでなく、将来的に追加される可能性のあるwindows-amd64-racedarwin-amd64-raceなど、あらゆるプラットフォームのレース検出器が有効なビルダーが、ダッシュボード上で一貫して「race」として表示されるようになります。これにより、ダッシュボードの表示がより柔軟で、将来の拡張にも対応しやすくなりました。

関連リンク

  • Gerrit Change-Id: https://golang.org/cl/10484046 (これはGoプロジェクトが使用しているコードレビューシステムGerritの変更リンクです。GitHubのコミットページからも参照されています。)

参考にした情報源リンク