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

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

このコミットは、src/pkg/net/tcp_test.go ファイルに対する変更です。このファイルは、Go言語の標準ライブラリである net パッケージ内のTCP関連機能のテストコードを含んでいます。具体的には、TCP接続における読み書き操作がメモリ割り当て(mallocs)にどの程度影響するかをテストする TestTCPReadWriteMallocs 関数が修正されています。

コミット

  • コミットハッシュ: 429a67e30033935d45e368d32b56dedb8c010fee
  • 作者: Dmitriy Vyukov (dvyukov@google.com)
  • コミット日時: 2013年8月6日 火曜日 14:43:36 +0400

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

https://github.com/golang/go/commit/429a67e30033935d45e368d32b56dedb8c010fee

元コミット内容

    net: fix intentional build breakage introduced in 12413043
    
    R=alex.brainman
    CC=golang-dev
    https://golang.org/cl/12502044

変更の背景

このコミットの背景には、以前のコミット 12413043 が意図的にビルドを壊したという記述があります。Web検索の結果、コミット 12413043 は、パニック発生時にスタックオーバーフローが発生する可能性のあるGoランタイムのバグを修正したものであることが判明しました。具体的には、スタックを拡張する役割を持つ runtime.morestack 関数が、パニック中に呼び出された際にそれ自体がスタックオーバーフローを引き起こす可能性があるという問題に対処しました。この修正は、パニックシナリオでもランタイムがスタックの拡張を正しく処理できるようにし、スタックオーバーフローによるプログラムのクラッシュを防ぐことを目的としていました。

今回のコミット 429a67e30033935d45e368d32b56dedb8c010fee は、その 12413043 コミットによって導入された「意図的なビルドの破損」を修正するものです。これは、おそらく以前のコミットが特定のテストケースで失敗するように変更されたか、あるいは特定の条件下でビルドが通らなくなるような変更を含んでいたため、その問題を解決するために行われたと考えられます。テストコードの変更であることから、以前のコミットが導入した問題がテストの失敗として現れていた可能性が高いです。

前提知識の解説

Go言語の net パッケージとTCPテスト

net パッケージは、Go言語におけるネットワークI/Oの主要なインターフェースを提供します。TCP/IP、UDP、Unixドメインソケットなど、様々なネットワークプロトコルを扱うための機能が含まれています。 src/pkg/net/tcp_test.go は、この net パッケージの中でもTCPプロトコルに関するテストを記述したファイルです。ネットワーク関連のコードは、様々な環境や条件下での挙動を保証するために厳密なテストが不可欠です。

TestTCPReadWriteMallocs 関数

このテスト関数は、TCP接続におけるデータの読み書き操作が、どの程度のメモリ割り当て(mallocs)を引き起こすかを検証するために設計されています。Go言語のランタイムは、ガベージコレクション(GC)によってメモリ管理を行いますが、不必要なメモリ割り当てはGCの頻度を増やし、アプリケーションのパフォーマンスに影響を与える可能性があります。そのため、ネットワークI/Oのような頻繁に行われる操作において、メモリ割り当てが最小限に抑えられていることを確認することは重要です。

mallocs とは

mallocs は、C言語の malloc 関数に由来する用語で、動的なメモリ割り当てを指します。Go言語では、newmake、あるいはスライスやマップの追加など、様々な操作でヒープメモリが割り当てられます。TestTCPReadWriteMallocs のようなテストでは、特定の操作中に発生するメモリ割り当ての回数を計測し、それが許容範囲内であるかを確認します。これにより、メモリ効率の良いコードが書かれているかを検証します。

runtime.GOOS

runtime.GOOS は、Go言語の標準ライブラリ runtime パッケージで提供される定数で、プログラムが実行されているオペレーティングシステム(OS)の名前を表します。例えば、Windowsであれば "windows"、Linuxであれば "linux" となります。 この定数を使用することで、OSに依存する挙動を持つコードに対して、OSごとに異なるテストロジックや期待値を設定することができます。今回のコミットでは、maxMallocs の値がOSによって異なる可能性があることを示唆しています。これは、OSのネットワークスタックの実装やシステムコールの挙動が異なるため、同じ操作でもメモリ割り当ての回数が変動しうることを意味します。

技術的詳細

このコミットの技術的な変更は非常にシンプルですが、その背景にある意図は重要です。

TestTCPReadWriteMallocs 関数内で、maxMallocs という変数の初期値が変更されています。

変更前:

maxMallocs := 0

変更後:

maxMallocs := 10000

この maxMallocs 変数は、TCPの読み書きテスト中に許容される最大メモリ割り当て回数を定義しています。 元のコミット 12413043 が「意図的なビルドの破損」を導入したとあることから、おそらくそのコミットによって、この TestTCPReadWriteMallocs テストが失敗するようになったと考えられます。maxMallocs0 に設定されている場合、TCPの読み書き操作中に一切のメモリ割り当てが発生しないことを期待しています。しかし、実際には何らかのメモリ割り当てが発生し、テストが失敗していたのでしょう。

今回の修正は、maxMallocs の値を 0 から 10000 に引き上げることで、このテストの許容範囲を広げています。これは、以前のコミットによって導入された変更が、TCPの読み書き操作におけるメモリ割り当ての挙動に影響を与え、少量のメモリ割り当てが発生するようになったことを示唆しています。

なぜ 0 だったのか、そしてなぜ 10000 に変更されたのかは、Goランタイムのメモリ管理戦略や、特定のOSにおけるネットワークI/Oの実装の詳細に依存します。0 という値は、理想的にはヒープ割り当てなしでTCPの読み書きができるべき、という設計思想があったのかもしれません。しかし、現実にはOSのシステムコールやGoランタイムの内部処理で、少量のバッファ割り当てなどが発生することがあります。

10000 という具体的な数値は、おそらくテストが安定してパスする最小限の許容値として設定されたものと考えられます。これは、以前のコミットが導入した変更が、メモリ割り当ての回数をわずかに増加させたものの、それが許容範囲内であると判断されたことを意味します。

switch runtime.GOOS ブロックが存在することから、将来的にはOSごとに異なる maxMallocs の値を設定する意図があったことがわかります。これは、OSのカーネルやネットワークスタックの実装の違いが、Goプログラムのメモリ割り当て挙動に影響を与える可能性があるためです。

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

--- a/src/pkg/net/tcp_test.go
+++ b/src/pkg/net/tcp_test.go
@@ -330,7 +330,7 @@ func TestTCPConcurrentAccept(t *testing.T) {
 }
 
 func TestTCPReadWriteMallocs(t *testing.T) {
-	maxMallocs := 0
+	maxMallocs := 10000
 	switch runtime.GOOS {
 	// Add other OSes if you know how many mallocs they do.
 	case "windows":

コアとなるコードの解説

変更は src/pkg/net/tcp_test.go ファイル内の TestTCPReadWriteMallocs 関数にあります。 この関数は、TCPの読み書き操作中に発生するメモリ割り当ての数をテストするためのものです。

変更された行は以下の通りです。

- maxMallocs := 0 + maxMallocs := 10000

これは、maxMallocs という変数の初期値を 0 から 10000 に変更しています。 この maxMallocs は、テスト中に許容される最大メモリ割り当て回数を定義しています。 変更前は、TCPの読み書き操作中にメモリ割り当てが一切発生しないことを期待していましたが、以前のコミット 12413043 によって導入された変更により、少量のメモリ割り当てが発生するようになったため、テストが失敗するようになりました。 このコミットでは、そのテストの失敗を修正するために、許容されるメモリ割り当て回数の上限を 10000 に引き上げています。これにより、テストが再びパスするようになります。

関連リンク

参考にした情報源リンク

  • GitHub Commit: https://github.com/golang/go/commit/429a67e30033935d45e368d32b56dedb8c010fee
  • Web検索結果 (golang commit 12413043): Go commit 12413043 は、パニック発生時にスタックオーバーフローが発生する可能性のあるGoランタイムのバグを修正したものです。具体的には、スタックを拡張する役割を持つ runtime.morestack 関数が、パニック中に呼び出された際にそれ自体がスタックオーバーフローを引き起こす可能性があるという問題に対処しました。この修正は、パニックシナリオでもランタイムがスタックの拡張を正しく処理できるようにし、スタックオーバーフローによるプログラムのクラッシュを防ぐことを目的としていました。