[インデックス 10787] ファイルの概要
このコミットは、以前のコミット (CL 5477092 / c3c6e72d7cc5) を元に戻す(undo)ものです。元のコミットは net/http
パッケージ内のエラーチェックのバグを修正しようとしましたが、その修正が予期せぬビルドの破損を引き起こしたため、一時的にその変更をロールバックしています。
コミット
commit 25e94154b719506511b16e0936dcea60846fa790
Author: Robert Griesemer <gri@golang.org>
Date: Wed Dec 14 10:44:34 2011 -0800
undo CL 5477092 / c3c6e72d7cc5
The obvious fix is breaking the build in non-obvious ways.
Reverting while waiting for the correct fix, if any is needed.
««« original CL description
net/http: fix bug in error checking
Thanks to josef86@gmail.com for pointing this out.
R=golang-dev, iant
CC=golang-dev
https://golang.org/cl/5477092
»»»
R=iant
CC=golang-dev
https://golang.org/cl/5488085
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/25e94154b719506511b16e0936dcea60846fa790
元コミット内容
このコミットが元に戻した元のコミット (CL 5477092) の内容は以下の通りです。
net/http: fix bug in error checking
Thanks to josef86@gmail.com for pointing this out.
R=golang-dev, iant
CC=golang-dev
https://golang.org/cl/5477092
この元のコミットは、net/http
パッケージにおけるエラーチェックのバグを修正することを目的としていました。
変更の背景
このコミットの背景には、以前のコミット (CL 5477092) がGoプロジェクトのビルドを予期せぬ形で破損させたという問題があります。元のコミットは net/http
パッケージのエラーチェックに関するバグを修正しようとしましたが、その「明白な修正 (obvious fix)」が「非明白な方法 (non-obvious ways)」でビルドを壊してしまいました。
Goプロジェクトでは、コードの安定性とビルドの健全性が非常に重視されます。そのため、たとえ意図した修正であっても、それがビルドプロセスや他のコンポーネントに悪影響を与える場合は、一時的にその変更を元に戻し、問題の原因を特定してより適切な解決策を見つけることが一般的なプラクティスです。このコミットは、まさにその一時的なロールバックとして実行されました。
前提知識の解説
Go言語のエラーハンドリング
Go言語では、エラーは戻り値として明示的に扱われます。関数は通常、最後の戻り値として error
型の値を返します。エラーが発生しなかった場合は nil
を返します。呼び出し元は、この error
値が nil
でないかどうかをチェックすることで、エラーが発生したかどうかを判断します。
例:
value, err := someFunction()
if err != nil {
// エラー処理
}
net/http
パッケージ
net/http
パッケージは、Go言語でHTTPクライアントおよびサーバーを実装するための標準ライブラリです。ウェブアプリケーションやAPIの構築において中心的な役割を果たします。このパッケージは、HTTPリクエストの送信、レスポンスの受信、ヘッダーの解析、ボディの読み取りなど、HTTP通信に関する様々な機能を提供します。
gzip.NewReader
compress/gzip
パッケージは、gzip形式の圧縮データを扱うための機能を提供します。gzip.NewReader(r io.Reader)
関数は、io.Reader
インターフェースを実装する入力ストリームからgzip圧縮データを読み取り、解凍するための *gzip.Reader
を返します。この関数は、*gzip.Reader
と共に error
を返します。エラーは、入力ストリームが有効なgzip形式でない場合などに発生します。
CL (Change List)
Goプロジェクトでは、コードの変更は「Change List (CL)」として提出され、レビューされます。これは、Gitのコミットに相当する概念ですが、Goのコードレビューシステム (Gerritベース) における変更の単位を指します。各CLには一意の番号が割り当てられ、レビュープロセスを経て最終的にメインのコードベースにマージされます。このコミットメッセージにある CL 5477092
や CL 5488085
は、それぞれ特定のコード変更の識別子です。
技術的詳細
このコミットが元に戻した元の修正は、net/http
パッケージ内の transport.go
ファイル、具体的には persistConn
型の readLoop
メソッドにおけるエラーチェックに関するものでした。
readLoop
メソッドは、HTTPレスポンスのボディを読み取る際に、Content-Encoding
ヘッダーが gzip
である場合に gzip.NewReader
を使用してボディを解凍しようとします。
元のコードでは、gzip.NewReader
が返すエラーを zerr
という変数で受け取っていました。しかし、その後のエラーチェックの if
文では、なぜか err != nil
と、別の err
変数(おそらくスコープ外の、または別の目的で使われている変数)をチェックしていました。
// 元のコミット (CL 5477092) での変更点
// 変更前: if zerr != nil {
// 変更後: if err != nil {
この変更は、gzip.NewReader
から返された zerr
を正しくチェックするように意図されたものと思われます。しかし、この修正が「非明白な方法でビルドを壊した」とされています。これは、err
という変数がそのスコープ内でどのように定義され、使用されていたか、あるいは他の場所で err
がどのように扱われていたかによって、予期せぬ副作用が生じた可能性を示唆しています。例えば、err
が既に別のエラーを保持していた場合、gzip.NewReader
のエラーが正しく伝播されなかったり、あるいは err
が未定義の状態で参照されたりするなどの問題が考えられます。
このコミットは、その「明白な修正」が引き起こしたビルドの問題を解決するために、元の if zerr != nil
に戻すことで、一時的に安定した状態に戻すことを目的としています。これは、問題の根本原因を特定し、より堅牢な修正を適用するまでの暫定措置です。
コアとなるコードの変更箇所
diff --git a/src/pkg/net/http/transport.go b/src/pkg/net/http/transport.go
index 62d36d6986..dc70be43f2 100644
--- a/src/pkg/net/http/transport.go
+++ b/src/pkg/net/http/transport.go
@@ -544,7 +544,7 @@ func (pc *persistConn) readLoop() {
resp.Header.Del("Content-Length")
resp.ContentLength = -1
gzipReader, zerr := gzip.NewReader(resp.Body)
- if zerr != nil {
+ if err != nil {
pc.close()
err = zerr
} else {
注: 上記のdiffは、このコミットが元に戻した変更を示しています。つまり、if err != nil
が if zerr != nil
に戻されたことを意味します。コミットメッセージのdiffは、このコミット自体が適用した変更(つまり、if err != nil
から if zerr != nil
への変更)を示しています。
コアとなるコードの解説
このコミットによって元に戻されたコードの変更は、src/pkg/net/http/transport.go
ファイルの readLoop
関数内にあります。
元のコミット (CL 5477092) では、以下の行が変更されました。
// 変更前 (このコミットで復元された状態):
if zerr != nil {
// 変更後 (CL 5477092 での修正):
if err != nil {
gzip.NewReader(resp.Body)
は、gzipReader
と zerr
の2つの値を返します。zerr
は gzip.NewReader
の実行中に発生したエラーを保持します。
CL 5477092 は、zerr
をチェックすべき場所で誤って err
をチェックしていたバグを修正しようとしました。しかし、この修正 (if err != nil
) がビルドを壊したため、このコミット (25e94154b719506511b16e0936dcea60846fa790
) はその変更を元に戻し、元の if zerr != nil
の状態に復元しました。
このロールバックは、err
という変数がそのスコープ内でどのように扱われていたか、または他の場所でどのように影響を与えていたかについて、より深い理解が必要であることを示唆しています。単に zerr
を err
に変更するだけでは、意図しない副作用が生じたため、一時的に元の状態に戻すことで、Goプロジェクトのビルドの安定性を確保しました。
関連リンク
- GitHub上のコミットページ: https://github.com/golang/go/commit/25e94154b719506511b16e0936dcea60846fa790
- 元のCL 5477092 (Go Change List): https://golang.org/cl/5477092 (ただし、このリンクは古いCLシステムのものであり、現在は直接アクセスできない可能性があります。)
- このコミットのCL 5488085 (Go Change List): https://golang.org/cl/5488085 (こちらも古いCLシステムのものであり、現在は直接アクセスできない可能性があります。)
参考にした情報源リンク
- Web search results for "golang CL 5477092": https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHYsNOO-BbSG64O5y41puL-s7Zq4FhWTgTlTs-TM-DeOIIBcbt5Tk12AqLbppBOO7b0kqN2wMLOMj1jDhWnrnLMDeGpwBinV7z0b3anHxMCWiFj7vN6o0E9NrLPTCAOKA8nrByDGso3j6CNeWdz6YQ=