https://bugs.ruby-lang.org/
https://bugs.ruby-lang.org/favicon.ico?1711330511
2010-07-04T20:44:09Z
Ruby Issue Tracking System
Ruby master - Bug #3515: FreeBSD wrongly raises ECONNRESET on close(2)
https://bugs.ruby-lang.org/issues/3515?journal_id=12139
2010-07-04T20:44:09Z
mame (Yusuke Endoh)
mame@ruby-lang.org
<ul><li><strong>Assignee</strong> set to <i>naruse (Yui NARUSE)</i></li><li><strong>Priority</strong> changed from <i>Normal</i> to <i>3</i></li><li><strong>Target version</strong> set to <i>1.9.2</i></li></ul><p>=begin<br>
遠藤です。</p>
<p>2010年7月2日12:20 Yui NARUSE <a href="mailto:redmine@ruby-lang.org" class="email">redmine@ruby-lang.org</a>:</p>
<blockquote>
<p>これらに共通するのは「Errno::ECONNRESET: Connection reset by peer」という例外が発生している点です。<br>
この例外は socket の close(2) を呼んだ際に errno に ECONNRESET がセットされたときに発生します。<br>
しかし、この挙動は POSIX 仕様外であり、FreeBSD 独自のものです。</p>
</blockquote>
<p><em>snip</em></p>
<blockquote>
<p>で、Ruby における対策ですが、close(2) で errno に ECONNRESET がセットされた場合、<br>
それを無視するべきだと思います。</p>
</blockquote>
<p>FreeBSD が勝手に独自仕様に走っているのを、Ruby 側で吸収する「べき」とは<br>
思いません。また、せっかく errno 設定しているのを、勝手に握りつぶしても<br>
よいものなんでしょうか。という疑問があるので、1.9.2 に入れるのはあまり<br>
乗り気でないです。</p>
<p>ですが、最終的には FreeBSD のプラットフォームメンテナの判断に任せます。<br>
この件で 1.9.2 のリリースを待つべきではありませんが、メンテナの判断が<br>
リリースに間に合えばコミットしてもいいかなと思います。ということで、<br>
優先度を Low にします。</p>
<p>redmine の wiki に FreeBSD のプラットフォームメンテナが載っていないの<br>
ですが、成瀬さんで正しいでしょうか。<br>
もし違ったら、FreeBSD は perhaps に降格となります。</p>
<p>--<br>
Yusuke Endoh <a href="mailto:mame@tsg.ne.jp" class="email">mame@tsg.ne.jp</a><br>
=end</p>
Ruby master - Bug #3515: FreeBSD wrongly raises ECONNRESET on close(2)
https://bugs.ruby-lang.org/issues/3515?journal_id=12145
2010-07-05T12:57:23Z
knu (Akinori MUSHA)
knu@ruby-lang.org
<ul></ul><p>=begin<br>
これは意図されてドキュメントもされている変更なので、挙動としてもPOSIX的にもwrongではないです。<br>
(SUSでは、ERRORSセクションで規定されている条件のいずれにも合致しないケースについて独自のエラーを<br>
発生させることは許されているはず)</p>
<p>幾度かMLやIRCでも俎上には登っていますが、現実のコードとして、けっこうシビアなネットワークプログラムでも<br>
close(2)の返り値をチェックしないものが多く、portsとかcontribを見ても(FreeBSD用に)ECONNRESETの対応を<br>
追加しているような例はほとんどありません。</p>
<p>その中で、OpenJDKではgetsockname(2)がFreeBSDでECONNRESETを返すというほぼ同じ問題に対して、同エラーを<br>
握りつぶす処理を独自パッチで追加しています。これに倣うというのは確かにありかもしれません。</p>
<p>悩ましいのは、Rubyがほぼ一律にerrnoが発生したときはraiseするという慣習がある一方、上記のようにclose(2)の<br>
失敗があまり検査されないという慣行を見た上で、それでも敢えてエラーを検出するプログラム向けにFYI的に<br>
ECONNRESETを教えてあげるというFreeBSDのこの挙動をどう扱うべきかというところですね。</p>
<p>DRbはSystemCallErrorについては自分で扱わずpass throughする方針のようだし、そういうライブラリはほかにも<br>
多そうなので互換性を考慮して握りつぶすのは仕方ないと言えるでしょうか。<br>
私は消極的ながら賛成です。(該当箇所にはコメントを入れてほしいです)<br>
=end</p>
Ruby master - Bug #3515: FreeBSD wrongly raises ECONNRESET on close(2)
https://bugs.ruby-lang.org/issues/3515?journal_id=12147
2010-07-05T19:14:43Z
naruse (Yui NARUSE)
naruse@airemix.jp
<ul></ul><p>=begin<br>
FreeBSD のメンテナは knu さんだと思っていました。</p>
<p>で、FreeBSDのこの挙動を知らない人には想像もつかない所で知らない例外が上がるため、<br>
Ruby側としては吸収せざるをえないと思います。<br>
例外のような処理を中断させてしまう方法以外で通知されるならまぁよかったのでしょうけど。</p>
<p>以下のような感じでtrunkにはコミットしようと思います。<br>
1.9.2はどうしましょうか。</p>
<p>diff --git a/ChangeLog b/ChangeLog<br>
index 8698b39..8853a0b 100644<br>
--- a/ChangeLog<br>
+++ b/ChangeLog<br>
@@ -1,3 +1,9 @@<br>
+Mon Jul 5 18:33:17 2010 NARUSE, Yui <a href="mailto:naruse@ruby-lang.org" class="email">naruse@ruby-lang.org</a><br>
+</p>
<ul>
<li>
<pre><code> * io.c (fptr_finalize): ignore ECONNRESET from close(2).
</code></pre>
</li>
<li>
<pre><code> FreeBSD wrongly sets ECONNRESET on close(2) and it causes
</code></pre>
</li>
<li>
<pre><code> false-negative exceptions. <a href="/issues/3515">[ruby-dev:41778]</a>
</code></pre>
</li>
<li>
</ul>
<p>Mon Jul 5 12:32:01 2010 Aaron Patterson <a href="mailto:aaron@tenderlovemaking.com" class="email">aaron@tenderlovemaking.com</a></p>
<pre><code> * ext/psych/lib/psych/scalar_scanner.rb (parse_string): support
</code></pre>
<p>diff --git a/io.c b/io.c<br>
index 5129a14..4c817b2 100644<br>
--- a/io.c<br>
+++ b/io.c<br>
@@ -3445,7 +3445,12 @@ fptr_finalize(rb_io_t <em>fptr, int noraise)<br>
/</em> fptr->fd may be closed even if close fails.<br>
* POSIX doesn't specify it.<br>
* We assumes it is closed. */</p>
<ul>
<li>
<pre><code> if (close(fptr->fd) < 0 && NIL_P(err))
</code></pre>
</li>
</ul>
<ul>
<li>
<pre><code> if (close(fptr->fd) < 0 && NIL_P(err)
</code></pre>
</li>
</ul>
<p>+#ifdef <strong>FreeBSD</strong></p>
<ul>
<li>
<pre><code> /* Ignore ECONNRESET of FreeBSD close(2) */
</code></pre>
</li>
<li>
<pre><code> && errno != ECONNRESET
</code></pre>
</li>
</ul>
<p>+#endif</p>
<ul>
<li>
<pre><code> )
err = noraise ? Qtrue : INT2NUM(errno);
</code></pre>
}<br>
skip_fd_close:</li>
</ul>
<p>=end</p>
Ruby master - Bug #3515: FreeBSD wrongly raises ECONNRESET on close(2)
https://bugs.ruby-lang.org/issues/3515?journal_id=12173
2010-07-06T15:44:59Z
akr (Akira Tanaka)
akr@fsij.org
<ul></ul><p>=begin<br>
2010年7月2日12:20 Yui NARUSE <a href="mailto:redmine@ruby-lang.org" class="email">redmine@ruby-lang.org</a>:</p>
<blockquote>
<p>この例外は socket の close(2) を呼んだ際に errno に ECONNRESET がセットされたときに発生します。<br>
しかし、この挙動は POSIX 仕様外であり、FreeBSD 独自のものです。</p>
</blockquote>
<h2>ちょっとした好奇心なんですが、close(fd) が ECONNRESET になった後、<br>
その fd は close されているんでしょうか、それともされていないんでしょうか。</h2>
<p>[田中 哲][たなか あきら][Tanaka Akira]</p>
<p>=end</p>
Ruby master - Bug #3515: FreeBSD wrongly raises ECONNRESET on close(2)
https://bugs.ruby-lang.org/issues/3515?journal_id=12174
2010-07-06T15:50:18Z
taca (Takahiro Kambe)
taca@back-street.net
<ul></ul><p>=begin<br>
In message <a href="mailto:AANLkTimD2geIuuhr0GQZ4fprYTv3m4kuESajvsrxaItm@mail.gmail.com" class="email">AANLkTimD2geIuuhr0GQZ4fprYTv3m4kuESajvsrxaItm@mail.gmail.com</a><br>
on Tue, 6 Jul 2010 15:44:50 +0900,<br>
Tanaka Akira <a href="mailto:akr@fsij.org" class="email">akr@fsij.org</a> wrote:</p>
<blockquote>
<p>2010年7月2日12:20 Yui NARUSE <a href="mailto:redmine@ruby-lang.org" class="email">redmine@ruby-lang.org</a>:</p>
<blockquote>
<p>この例外は socket の close(2) を呼んだ際に errno に ECONNRESET がセットされたときに発生します。^M<br>
何が、ここに制御文字(Ctl-M)を入れてるのだろう?</p>
</blockquote>
</blockquote>
<blockquote>
<blockquote>
<p>しかし、この挙動は POSIX 仕様外であり、FreeBSD 独自のものです。</p>
</blockquote>
<p>ちょっとした好奇心なんですが、close(fd) が ECONNRESET になった後、<br>
その fd は close されているんでしょうか、それともされていないんでしょうか。<br>
さらに好奇心なのですが、close(fd)がECONNRESETになる状況を確認できる<br>
簡単なプログラムはないでしょうか?</p>
</blockquote>
<p>--<br>
神戸 隆博 (かんべ たかひろ) at 仕事場</p>
<p>=end</p>
Ruby master - Bug #3515: FreeBSD wrongly raises ECONNRESET on close(2)
https://bugs.ruby-lang.org/issues/3515?journal_id=12176
2010-07-06T17:58:12Z
naruse (Yui NARUSE)
naruse@airemix.jp
<ul></ul><p>=begin<br>
成瀬です。</p>
<p>2010年7月6日15:44 Tanaka Akira <a href="mailto:akr@fsij.org" class="email">akr@fsij.org</a>:</p>
<blockquote>
<p>2010年7月2日12:20 Yui NARUSE <a href="mailto:redmine@ruby-lang.org" class="email">redmine@ruby-lang.org</a>:</p>
<blockquote>
<p>この例外は socket の close(2) を呼んだ際に errno に ECONNRESET がセットされたときに発生します。<br>
しかし、この挙動は POSIX 仕様外であり、FreeBSD 独自のものです。</p>
</blockquote>
<p>ちょっとした好奇心なんですが、close(fd) が ECONNRESET になった後、<br>
その fd は close されているんでしょうか、それともされていないんでしょうか。</p>
</blockquote>
<p><a href="http://svn.freebsd.org/viewvc/base/head/lib/libstand/close.c?revision=165906&view=markup" class="external">http://svn.freebsd.org/viewvc/base/head/lib/libstand/close.c?revision=165906&view=markup</a><br>
を見ると、呼んだ結果にかかわらず f->f_flags = 0; していますね。</p>
<p>--<br>
NARUSE, Yui<br>
<a href="mailto:naruse@airemix.jp" class="email">naruse@airemix.jp</a></p>
<p>=end</p>
Ruby master - Bug #3515: FreeBSD wrongly raises ECONNRESET on close(2)
https://bugs.ruby-lang.org/issues/3515?journal_id=12177
2010-07-06T18:02:35Z
naruse (Yui NARUSE)
naruse@airemix.jp
<ul></ul><p>=begin<br>
成瀬です。</p>
<p>2010年7月6日15:50 Takahiro Kambe <a href="mailto:taca@back-street.net" class="email">taca@back-street.net</a>:</p>
<blockquote>
<p>さらに好奇心なのですが、close(fd)がECONNRESETになる状況を確認できる<br>
簡単なプログラムはないでしょうか?</p>
</blockquote>
<p>わたしは make TESTS='-v drb/test_drbssl.rb -n test_03' test-all で確認しています。<br>
Ruby 側に手をいれつつ何度か走らせれば確認はできるかと思います。</p>
<p>--<br>
NARUSE, Yui<br>
<a href="mailto:naruse@airemix.jp" class="email">naruse@airemix.jp</a></p>
<p>=end</p>
Ruby master - Bug #3515: FreeBSD wrongly raises ECONNRESET on close(2)
https://bugs.ruby-lang.org/issues/3515?journal_id=12209
2010-07-07T10:37:05Z
naruse (Yui NARUSE)
naruse@airemix.jp
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Closed</i></li><li><strong>% Done</strong> changed from <i>0</i> to <i>100</i></li></ul><p>=begin<br>
This issue was solved with changeset r28561.<br>
Yui, thank you for reporting this issue.<br>
Your contribution to Ruby is greatly appreciated.<br>
May Ruby be with you.</p>
<p>=end</p>
Ruby master - Bug #3515: FreeBSD wrongly raises ECONNRESET on close(2)
https://bugs.ruby-lang.org/issues/3515?journal_id=12271
2010-07-11T22:23:19Z
taca (Takahiro Kambe)
taca@back-street.net
<ul></ul><p>=begin<br>
In message <a href="mailto:AANLkTilOo-wOIY7J1wkqY9ljTwLAzg0l6cQf3hB7qhI5@mail.gmail.com" class="email">AANLkTilOo-wOIY7J1wkqY9ljTwLAzg0l6cQf3hB7qhI5@mail.gmail.com</a><br>
on Tue, 6 Jul 2010 18:02:26 +0900,<br>
"NARUSE, Yui" <a href="mailto:naruse@airemix.jp" class="email">naruse@airemix.jp</a> wrote:</p>
<blockquote>
<p>2010年7月6日15:50 Takahiro Kambe <a href="mailto:taca@back-street.net" class="email">taca@back-street.net</a>:</p>
<blockquote>
<p>さらに好奇心なのですが、close(fd)がECONNRESETになる状況を確認できる<br>
簡単なプログラムはないでしょうか?</p>
</blockquote>
<p>わたしは make TESTS='-v drb/test_drbssl.rb -n test_03' test-all で確認しています。<br>
Ruby 側に手をいれつつ何度か走らせれば確認はできるかと思います。<br>
うーん、単体のCのプログラムで思ってました。;-(</p>
</blockquote>
<p>--<br>
神戸 隆博 / Takahiro Kambe</p>
<p>=end</p>