[インデックス 18288] ファイルの概要
このコミットは、Go言語のsyscall
パッケージにおけるgetrlimit
およびsetrlimit
システムコールに関するテストの改善を目的としています。具体的には、これらのテストがLinuxだけでなく、より広範なUnix系OS(Darwin, DragonFly BSD, FreeBSD, NetBSD, OpenBSD)で動作するように修正されています。ファイル名のリネームとビルドタグの追加によって、テストのプラットフォーム互換性が向上しています。
コミット
commit 3baa98f26d94c2c8a890a1f1f1595c249932e609
Author: Mikio Hara <mikioh.mikioh@gmail.com>
Date: Sat Jan 18 08:34:31 2014 +0900
syscall: make getrlimit, setrlimit tests work on unix variants
R=golang-codereviews, iant
CC=golang-codereviews
https://golang.org/cl/53690043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/3baa98f26d94c2c8a890a1f1f1595c249932e609
元コミット内容
diff --git a/src/pkg/syscall/rlimit_linux_test.go b/src/pkg/syscall/rlimit_unix_test.go
similarity index 94%
rename from src/pkg/syscall/rlimit_linux_test.go
rename to src/pkg/syscall/rlimit_unix_test.go
index 4ec720e936..b96c4bb996 100644
--- a/src/pkg/syscall/rlimit_linux_test.go
+++ b/src/pkg/syscall/rlimit_unix_test.go
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+// +build darwin dragonfly freebsd linux netbsd openbsd
+
package syscall_test
import (
変更の背景
この変更の背景には、Go言語の標準ライブラリ、特にsyscall
パッケージのテストカバレッジと移植性の向上が挙げられます。元々rlimit_linux_test.go
というファイル名が示すように、このテストファイルはLinux環境に特化していました。しかし、getrlimit
やsetrlimit
といったリソース制限を操作するシステムコールは、Linuxだけでなく多くのUnix系オペレーティングシステムで共通して利用できる機能です。
Go言語はクロスプラットフォーム開発を強く意識しており、可能な限り多くの環境でコードが正しく動作することを保証する必要があります。そのため、特定のOSに限定されていたテストを、共通の機能を持つ他のUnix系OSでも実行できるようにすることは、Go言語の品質と信頼性を高める上で重要なステップでした。この変更により、テストの適用範囲が広がり、異なるUnix系環境での潜在的なバグや互換性の問題が早期に発見できるようになります。
前提知識の解説
1. システムコール (System Call)
システムコールは、オペレーティングシステム (OS) のカーネルが提供するサービスを、ユーザー空間のプログラムが利用するためのインターフェースです。ファイル操作、メモリ管理、プロセス制御、ネットワーク通信など、OSの根幹に関わる機能はシステムコールを通じて実行されます。Go言語のsyscall
パッケージは、これらのシステムコールをGoプログラムから直接呼び出すための機能を提供します。
2. リソース制限 (Resource Limits)
リソース制限(Resource Limits、またはrlimit)は、Unix系OSにおいて、プロセスが利用できるシステムリソースの量に上限を設定するメカニズムです。これにより、単一のプロセスがシステム全体のリソースを枯渇させることを防ぎ、システムの安定性を保ちます。設定できるリソースには以下のようなものがあります。
- CPU時間 (CPU time): プロセスが使用できるCPU時間の最大値。
- ファイルサイズ (File size): プロセスが作成できるファイルの最大サイズ。
- データセグメントサイズ (Data segment size): プロセスのデータセグメントの最大サイズ。
- スタックサイズ (Stack size): プロセスのスタックの最大サイズ。
- オープンできるファイルディスクリプタの数 (Number of open file descriptors): プロセスが同時にオープンできるファイルの最大数。
- プロセス数 (Number of processes): ユーザーが実行できるプロセスの最大数。
リソース制限には、以下の2つの値があります。
- ソフトリミット (Soft limit): 現在適用されている制限値。プロセスはこの値を超えてリソースを使用できません。ソフトリミットは、特権を持たないプロセスでも
setrlimit
システムコールを使って、ハードリミットを超えない範囲で引き上げることができます。 - ハードリミット (Hard limit): ソフトリミットが超えることのできない上限値。ハードリミットは、特権を持たないプロセスは引き上げることができません(引き下げることは可能)。
3. getrlimit
と setrlimit
システムコール
getrlimit(2)
: 指定されたリソースのリソース制限(ソフトリミットとハードリミット)を取得するためのシステムコールです。setrlimit(2)
: 指定されたリソースのリソース制限(ソフトリミットとハードリミット)を設定するためのシステムコールです。
これらのシステムコールは、C言語では通常、sys/resource.h
ヘッダファイルで定義されており、RLIMIT_CPU
, RLIMIT_FSIZE
などの定数でリソースの種類を指定します。
4. Go言語のビルドタグ (Build Tags)
Go言語には、特定の環境でのみコンパイルされるコードを記述するための「ビルドタグ」という機能があります。ソースファイルの先頭に// +build tag_name
のようなコメントを記述することで、そのファイルが特定のビルドタグが有効な場合にのみコンパイルされるように指定できます。
例えば、// +build linux
と記述されたファイルはLinux環境でのみコンパイルされ、// +build darwin dragonfly freebsd linux netbsd openbsd
と記述されたファイルは、これらのいずれかのOSでコンパイルされます。これにより、OS固有のコードやテストを適切に分離し、クロスプラットフォーム対応を容易にすることができます。
技術的詳細
このコミットの技術的詳細は、Go言語のビルドシステムとUnix系OSのリソース制限メカニズムの連携にあります。
元々src/pkg/syscall/rlimit_linux_test.go
というファイルは、その名前が示す通り、Linux環境でのみgetrlimit
およびsetrlimit
のテストを実行することを意図していました。これは、Goのビルドシステムがファイル名やディレクトリ構造に基づいて特定のOS向けのコードを自動的に選択する慣習に従っていたためと考えられます(例: _linux.go
はLinux向け)。
しかし、getrlimit
とsetrlimit
はPOSIX標準の一部であり、Linuxだけでなく、macOS (Darwin)、DragonFly BSD、FreeBSD、NetBSD、OpenBSDといった主要なUnix系OSでも同様の機能が提供されています。これらのOSでは、リソース制限の概念とシステムコールのインターフェースが非常に似ています。
このコミットでは、テストの適用範囲を広げるために以下の変更が行われました。
- ファイルのリネーム:
rlimit_linux_test.go
からrlimit_unix_test.go
へのリネーム。これにより、ファイル名が特定のOSに限定されなくなり、より一般的なUnix系OS向けのテストであることを示唆するようになりました。 - ビルドタグの追加: リネームされたファイル
rlimit_unix_test.go
の先頭に、// +build darwin dragonfly freebsd linux netbsd openbsd
というビルドタグが追加されました。このタグは、Goコンパイラに対して、このファイルが指定されたすべてのOSでコンパイルされるべきであることを指示します。
この変更により、Goのビルドツールは、これらのUnix系OSのいずれかでビルドが実行される際に、rlimit_unix_test.go
をコンパイル対象に含めるようになります。結果として、getrlimit
とsetrlimit
のテストは、Linuxだけでなく、macOSや各種BSD系OSでも実行されるようになり、これらのプラットフォームでのリソース制限関連のシステムコールがGo言語から正しく機能するかどうかが検証されるようになりました。
これは、Go言語の標準ライブラリが、異なるOS環境下でも一貫した動作と高い信頼性を提供するための、継続的な努力の一環と言えます。特にシステムコールのようなOSに密接に関連する機能においては、各プラットフォームでの互換性を確保するためのこのような細やかな調整が不可欠です。
コアとなるコードの変更箇所
このコミットにおけるコアとなるコードの変更は、単一のテストファイルに対するものです。
- 変更前:
src/pkg/syscall/rlimit_linux_test.go
- 変更後:
src/pkg/syscall/rlimit_unix_test.go
具体的な変更内容は以下の通りです。
--- a/src/pkg/syscall/rlimit_linux_test.go
+++ b/src/pkg/syscall/rlimit_unix_test.go
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+// +build darwin dragonfly freebsd linux netbsd openbsd
+
package syscall_test
import (
コアとなるコードの解説
この変更は非常にシンプルですが、その影響は大きいです。
-
ファイルのリネーム:
rlimit_linux_test.go
からrlimit_unix_test.go
へのリネームは、このテストファイルがもはやLinux専用ではないことを明確に示しています。Goの慣習として、ファイル名にOS名が含まれる場合、そのファイルはそのOS専用のコードであることを意味します。_unix
という接尾辞は、より広範なUnix系OSに適用されることを示唆します。 -
ビルドタグの追加:
// +build darwin dragonfly freebsd linux netbsd openbsd
この行はGoのビルドタグです。Goコンパイラは、ソースファイルの先頭にあるこの形式のコメントを解析し、どのファイルがどの環境でコンパイルされるべきかを決定します。darwin
: macOSdragonfly
: DragonFly BSDfreebsd
: FreeBSDlinux
: Linuxnetbsd
: NetBSDopenbsd
: OpenBSD
このビルドタグが追加されたことにより、
rlimit_unix_test.go
ファイルは、上記のいずれかのOS上でGoプログラムがビルドされる際に、コンパイル対象として含まれるようになります。これにより、getrlimit
とsetrlimit
に関するテストが、これらの複数のUnix系OSで実行され、それぞれの環境でのシステムコールの動作が検証されることになります。
この変更は、テストの網羅性を高め、Go言語のsyscall
パッケージが提供するリソース制限機能が、様々なUnix系プラットフォームで期待通りに動作することを保証するために不可欠です。
関連リンク
- Go言語の
syscall
パッケージのドキュメント: https://pkg.go.dev/syscall - Go言語のビルド制約(Build Constraints)に関する公式ドキュメント: https://pkg.go.dev/cmd/go#hdr-Build_constraints
getrlimit(2)
manページ (Linux): https://man7.org/linux/man-pages/man2/getrlimit.2.htmlsetrlimit(2)
manページ (Linux): https://man7.org/linux/man-pages/man2/setrlimit.2.html
参考にした情報源リンク
- Go言語の公式ドキュメント
- Unix系OSのmanページ (
getrlimit(2)
,setrlimit(2)
) - GitHubのGo言語リポジトリのコミット履歴
- 一般的なシステムプログラミングに関する知識
- POSIX標準に関する情報 (リソース制限の共通性について)
- Go言語のビルドタグに関するブログ記事やチュートリアル (一般的な知識として)
- https://golang.org/cl/53690043 (Go Code Reviewのリンク)
- https://github.com/golang/go/commit/3baa98f26d94c2c8a890a1f1f1595c249932e609 (GitHubコミットページ)