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

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

このコミットは、Go言語のコードレビューツールの一部である lib/codereview/codereview.py ファイルに変更を加えています。具体的には、hg upload コマンドがサーバーにコードをアップロードする際に、サーバーが誤って「アップロードするものがない」と報告した場合に警告メッセージを表示する機能を追加しています。

コミット

commit 673917f87879e32e81e55b3cc5fa027a5c8fce0a
Author: Russ Cox <rsc@golang.org>
Date:   Thu Feb 13 05:06:46 2014 +0000

    codereview: warn about 'hg upload' not uploading
    
    This seems to be what causes the 'chunk mismatch' errors.
    I don't know why the server tells us there's nothing to upload,
    but at the least we can warn that it did, so that the user
    will try again.
    
    LGTM=bradfitz
    R=golang-codereviews, bradfitz
    CC=golang-codereviews
    https://golang.org/cl/62840043

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

https://github.com/golang/go/commit/673917f87879e32e81e55b3cc5fa027a5c8fce0a

元コミット内容

codereview: warn about 'hg upload' not uploading

This seems to be what causes the 'chunk mismatch' errors.
I don't know why the server tells us there's nothing to upload,
but at the least we can warn that it did, so that the user
will try again.

LGTM=bradfitz
R=golang-codereviews, bradfitz
CC=golang-codereviews
https://golang.org/cl/62840043

変更の背景

このコミットは、Go言語のコードレビュープロセスにおいて発生していた特定の問題に対処するために導入されました。当時、GoプロジェクトではMercurial (hg) をバージョン管理システムとして使用しており、コードレビューには専用の codereview ツールが用いられていました。

問題の核心は、hg upload コマンドを使用して変更をコードレビューシステムにアップロードしようとした際に、「chunk mismatch」エラーが発生することがあった点です。コミットメッセージによると、このエラーは、サーバーが実際にはアップロードすべき変更があるにもかかわらず、クライアントに対して「アップロードするものがない」と誤って報告することが原因であると推測されています。

サーバーがこのような誤った応答を返す具体的な理由は不明でしたが、この状況ではユーザーはアップロードが成功したと誤解し、結果としてコードレビューが開始されない、または不完全な状態になる可能性がありました。このコミットの目的は、サーバーが「アップロードするものがない」と報告した場合に、ユーザーにその旨を警告し、再試行を促すことで、この混乱とエラーを軽減することにありました。これにより、ユーザーは問題が発生していることを認識し、適切な対応を取ることができるようになります。

前提知識の解説

このコミットを理解するためには、以下の技術的背景知識が必要です。

  • Mercurial (hg): Mercurialは、Gitと同様の分散型バージョン管理システム(DVCS)です。Goプロジェクトは初期にMercurialを使用していましたが、後にGitに移行しました。hg upload コマンドは、ローカルのリポジトリの変更をリモートのサーバーにアップロードするために使用されます。これはGitにおける git pushgit send-email に相当する操作です。

  • Goのコードレビュープロセスと codereview ツール: Goプロジェクトは、独自のコードレビューシステムとツールを使用していました。このシステムは、Googleの内部コードレビューシステム(PerforceベースのMondrianや、後のGerrit)にインスパイアされたもので、変更セット(チェンジリスト、CL)をサーバーにアップロードし、レビューアがそれに対してコメントを付け、承認(LGTM: Looks Good To Me)を行うという流れでした。 codereview.py は、このプロセスをクライアント側で支援するためのPythonスクリプトであり、変更の準備、アップロード、ステータスの確認などを行っていました。

  • チェンジリスト (CL): チェンジリスト(Change List, CL)は、バージョン管理システムにおける一連の変更のまとまりを指します。Goのコードレビューシステムでは、各CLがレビューの単位となります。hg upload は、ローカルの変更をCLとしてサーバーに提出する役割を担っていました。

  • 「chunk mismatch」エラー: このエラーは、データ転送中にクライアントとサーバーの間でデータの整合性が取れていない場合に発生する一般的な問題です。特に、大きなファイルや多数の変更を転送する際に、ネットワークの問題、サーバーの負荷、またはプロトコルの不一致などによって、送信されたデータのチャンク(塊)が受信側で期待されるものと一致しない場合に発生します。このコミットの文脈では、サーバーが「アップロードするものがない」と誤って判断した結果、クライアントが送信しようとしたデータとサーバーの期待値との間に不一致が生じ、「chunk mismatch」として表面化していたと考えられます。

  • 標準エラー出力 (sys.stderr): Unix系システムにおいて、プログラムの出力は通常、標準出力(stdout)と標準エラー出力(stderr)の2つのストリームに分けられます。標準出力は通常のプログラムの出力に使用され、標準エラー出力はエラーメッセージや診断メッセージの出力に使用されます。print >>sys.stderr は、Pythonでメッセージを標準エラー出力に書き込むための構文です。これにより、通常のプログラム出力とは別に、エラーや警告をユーザーに通知することができます。

技術的詳細

このコミットが対処している問題は、hg upload コマンドがGoのコードレビューシステムにパッチセットをアップロードする際に、サーバーからの応答が期待と異なる場合に発生するものです。

通常、hg upload はローカルの変更をサーバーに送信し、サーバーはそれを受け取って新しいパッチセットを作成します。この際、サーバーはアップロードされたパッチセットに関する情報(例: patchset = lines[1].strip() で取得されるパッチセットIDなど)をクライアントに返します。

しかし、問題は、サーバーが何らかの理由で「アップロードするものがない」と判断し、その旨をクライアントに伝えてしまうことにありました。コミットメッセージにある if response_body.startswith("Issue updated.") の条件は、サーバーからの応答が「Issue updated.」で始まる場合に、アップロードが成功したと見なすロジックを示唆しています。しかし、この条件が満たされない、かつ lines[0] に「アップロードするものがない」といった内容のメッセージが含まれる場合に、クライアント側ではアップロードが失敗したと判断すべきですが、既存のロジックではそのハンドリングが不十分でした。

このコミットは、このギャップを埋めるものです。具体的には、サーバーからの応答が期待される成功メッセージ(Issue updated.)で始まらない場合、かつ、パッチセット情報が取得できない(lines[1] 以降のデータがない)場合に、サーバーが「アップロードするものがない」と報告していると判断します。この状況は、実際にはアップロードすべき変更があるにもかかわらず発生するため、ユーザーに警告を発することで、問題の存在を知らせ、再試行を促すというアプローチを取っています。

この警告は sys.stderr に出力されるため、通常のプログラム出力とは区別され、ユーザーの注意を引きやすくなっています。これにより、ユーザーは「chunk mismatch」のような不明瞭なエラーに直面する前に、アップロードが正しく行われていない可能性を認識できるようになります。これは、サーバー側の根本的な問題を解決するものではありませんが、クライアント側でのユーザーエクスペリエンスを向上させるための実用的な対策と言えます。

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

変更は lib/codereview/codereview.py ファイルの CL クラス内で行われています。

--- a/lib/codereview/codereview.py
+++ b/lib/codereview/codereview.py
@@ -367,6 +367,8 @@ class CL(object):
 			msg = lines[0]
 			patchset = lines[1].strip()
 			patches = [x.split(" ", 1) for x in lines[2:]]
+		else:
+			print >>sys.stderr, "Server says there is nothing to upload (probably wrong):\\n" + msg
 		if response_body.startswith("Issue updated.") and quiet:
 			pass
 		else:

コアとなるコードの解説

追加されたコードは以下の2行です。

		else:
			print >>sys.stderr, "Server says there is nothing to upload (probably wrong):\\n" + msg

このコードは、CL クラスの upload メソッド(またはそれに相当するアップロード処理を行う部分)に挿入されています。

既存のコードでは、サーバーからの応答 response_body を解析し、lines リストに分割しています。そして、msg = lines[0] で最初の行をメッセージとして取得し、patchset = lines[1].strip() で2行目からパッチセット情報を取得しています。

追加された else: ブロックは、この patchset = lines[1].strip() の行を含む try ブロック(または同様の条件分岐)の else 節として機能していると推測されます。つまり、サーバーからの応答が期待される形式(パッチセット情報を含む形式)でなかった場合に、この else ブロックが実行されます。

この else ブロック内で、以下の処理が行われます。

  1. print >>sys.stderr, ...: 標準エラー出力 (sys.stderr) にメッセージを出力します。これにより、通常のプログラム出力とは別に、ユーザーに警告が表示されます。
  2. "Server says there is nothing to upload (probably wrong):\\n" + msg: 出力される警告メッセージです。
    • "Server says there is nothing to upload (probably wrong):": これは、サーバーが「アップロードするものがない」と報告しているが、それがおそらく誤りであるということをユーザーに明確に伝えるための固定文字列です。
    • "\\n": 改行コードです。
    • msg: サーバーからの応答の最初の行 (lines[0]) に含まれるメッセージです。これにより、サーバーが具体的にどのようなメッセージを返してきたのかをユーザーが確認できます。

この変更により、hg upload がサーバーから「アップロードするものがない」という誤った応答を受け取った場合、ユーザーはすぐにその状況を認識し、アップロードが失敗した可能性を理解できるようになります。これにより、ユーザーは手動で再試行するなどの適切な対応を取ることが可能になり、「chunk mismatch」エラーのような、より理解しにくいエラーに直面する前に問題を解決できるようになります。

関連リンク

参考にした情報源リンク

  • コミットメッセージと変更されたコードスニペット
  • Goプロジェクトの公式ドキュメントおよびWiki (Goのコードレビュープロセスに関する一般的な情報)
  • Mercurialの一般的な知識
  • 標準エラー出力に関するPythonの一般的な知識
  • 分散型バージョン管理システムおよびコードレビューシステムの一般的な概念