[#41778] [Bug #3515] FreeBSD wrongly raises ECONNRESET on close(2) — Yui NARUSE <redmine@...>

Bug #3515: FreeBSD wrongly raises ECONNRESET on close(2)

12 messages 2010/07/02

[ruby-dev:41813] [Bug #3515] FreeBSD wrongly raises ECONNRESET on close(2)

From: Akinori MUSHA <redmine@...>
Date: 2010-07-05 03:57:24 UTC
List: ruby-dev #41813
チケット #3515 が更新されました。 (by Akinori MUSHA)


これは意図されてドキュメントもされている変更なので、挙動としてもPOSIX的にもwrongではないです。
(SUSでは、ERRORSセクションで規定されている条件のいずれにも合致しないケースについて独自のエラーを
発生させることは許されているはず)

幾度かMLやIRCでも俎上には登っていますが、現実のコードとして、けっこうシビアなネットワークプログラムでも
close(2)の返り値をチェックしないものが多く、portsとかcontribを見ても(FreeBSD用に)ECONNRESETの対応を
追加しているような例はほとんどありません。

その中で、OpenJDKではgetsockname(2)がFreeBSDでECONNRESETを返すというほぼ同じ問題に対して、同エラーを
握りつぶす処理を独自パッチで追加しています。これに倣うというのは確かにありかもしれません。

悩ましいのは、Rubyがほぼ一律にerrnoが発生したときはraiseするという慣習がある一方、上記のようにclose(2)の
失敗があまり検査されないという慣行を見た上で、それでも敢えてエラーを検出するプログラム向けにFYI的に
ECONNRESETを教えてあげるというFreeBSDのこの挙動をどう扱うべきかというところですね。

DRbはSystemCallErrorについては自分で扱わずpass throughする方針のようだし、そういうライブラリはほかにも
多そうなので互換性を考慮して握りつぶすのは仕方ないと言えるでしょうか。
私は消極的ながら賛成です。(該当箇所にはコメントを入れてほしいです)
----------------------------------------
http://redmine.ruby-lang.org/issues/show/3515

----------------------------------------
http://redmine.ruby-lang.org

In This Thread