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

[インデックス 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 5477092CL 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 != nilif 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) は、gzipReaderzerr の2つの値を返します。zerrgzip.NewReader の実行中に発生したエラーを保持します。

CL 5477092 は、zerr をチェックすべき場所で誤って err をチェックしていたバグを修正しようとしました。しかし、この修正 (if err != nil) がビルドを壊したため、このコミット (25e94154b719506511b16e0936dcea60846fa790) はその変更を元に戻し、元の if zerr != nil の状態に復元しました。

このロールバックは、err という変数がそのスコープ内でどのように扱われていたか、または他の場所でどのように影響を与えていたかについて、より深い理解が必要であることを示唆しています。単に zerrerr に変更するだけでは、意図しない副作用が生じたため、一時的に元の状態に戻すことで、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=