[#45627] some warnings compiled with gcc 4.6.3 — SASADA Koichi <ko1@...>
ささだです.
6 messages
2012/05/06
[#45637] [ruby-trunk - Feature #6440][Open] 引数にIOを渡した場合のMarshal.loadにバッファを持たせたい — "Glass_saga (Masaki Matsushita)" <glass.saga@...>
14 messages
2012/05/16
[#45644] Re: [ruby-trunk - Feature #6440][Open] 引数にIOを渡した場合のMarshal.loadにバッファを持たせたい
— Tanaka Akira <akr@...>
2012/05/17
2012/5/16 Glass_saga (Masaki Matsushita) <glass.saga@gmail.com>:
[#45645] Re: [ruby-trunk - Feature #6440][Open] 引数にIOを渡した場合のMarshal.loadにバッファを持たせたい
— Nobuyoshi Nakada <nobu@...>
2012/05/17
なかだです。
[#45646] Re: [ruby-trunk - Feature #6440][Open] 引数にIOを渡した場合のMarshal.loadにバッファを持たせたい
— Tanaka Akira <akr@...>
2012/05/17
2012/5/17 Nobuyoshi Nakada <nobu@ruby-lang.org>:
[#45650] space in COUTFLAG — Takahiro Kambe <taca@...>
こんにちは。
6 messages
2012/05/18
[#45670] [ruby-trunk - Bug #6479][Open] ipaddr.rbの受け付ける書式が、プラットフォームによって異なる — "kachick (Kenichi Kamiya)" <kachick1+ruby@...>
9 messages
2012/05/22
[#45671] [ruby-trunk - Bug #6479][Assigned] ipaddr.rbの受け付ける書式が、プラットフォームによって異なる
— "knu (Akinori MUSHA)" <knu@...>
2012/05/23
[#45673] Bug?: level argument of caller — SASADA Koichi <ko1@...>
ささだです.
4 messages
2012/05/23
[ruby-dev:45658] [ruby-trunk - Bug #4387][Feedback] test_socket_connect_nonblock(TestSocketAddrinfo) がまれに失敗する
From:
"naruse (Yui NARUSE)" <naruse@...>
Date:
2012-05-19 22:58:51 UTC
List:
ruby-dev #45658
Issue #4387 has been updated by naruse (Yui NARUSE).
Status changed from Rejected to Feedback
[ruby-list:38139] にもスレがありますね。
まとめると、
1. connect_nonblock を呼ぶ
2.1. ECONNREFUSED が返る (localhost など結果が瞬間的に返る場合)
2.2.1. EINPROGRESS が返る
2.2.2. select で待つ→成功か失敗に収束
2.2.3.1. EISCONN が返る (成功)
2.2.3.2. EINVAL が返る (失敗)
って事のようです。
ここで EINVAL が返るのはFreeBSD や NetBSD もそうです。
Linux の場合、とりあえず手元で試した「localhost の開いていないポートに接続」というケースでは、
ECONNABORTED が返ってきました。
さて、ここでの悩みどころは改めて connect_nonblock して EINVAL が返ってきてしまうと、
もはや失敗した理由はわからなくなってしまう事です。
これは、例えば以下のように connect_nonblock の前に getsockopt すれば理由がわかります。
diff --git a/test/socket/test_addrinfo.rb b/test/socket/test_addrinfo.rb
index 3240b9d..1e047c9 100644
--- a/test/socket/test_addrinfo.rb
+++ b/test/socket/test_addrinfo.rb
@@ -159,6 +159,8 @@ class TestSocketAddrinfo < Test::Unit::TestCase
s2.connect_nonblock(ai)
rescue IO::WaitWritable
IO.select(nil, [s2])
+ r = s2.getsockopt(Socket::SOL_SOCKET, Socket::SO_ERROR)
+ assert_equal(0, r.int, "NOERROR is expected but #{r.inspect}")
begin
s2.connect_nonblock(ai)
rescue Errno::EISCONN
----------------------------------------
Bug #4387: test_socket_connect_nonblock(TestSocketAddrinfo) がまれに失敗する
https://bugs.ruby-lang.org/issues/4387#change-26722
Author: kosaki (Motohiro KOSAKI)
Status: Feedback
Priority: Normal
Assignee:
Category: core
Target version: 2.0.0
ruby -v: ruby 1.9.3dev (2011-02-09 trunk 30831) [i386-mswin32_100]
=begin
1割ぐらいの確率でtest-allが以下のエラーを吐きます
57) Error:
test_socket_connect_nonblock(TestSocketAddrinfo):
Errno::EINVAL: Invalid argument - connect(2)
C:/ruby/trunk/test/socket/test_addrinfo.rb:163:in `connect_nonblock'
C:/ruby/trunk/test/socket/test_addrinfo.rb:163:in `rescue in test_socket_con
nect_nonblock'
C:/ruby/trunk/test/socket/test_addrinfo.rb:158:in `test_socket_connect_nonbl
ock'
なお、OSレベルでは WSAGetLastError() が WSAEINVALを返しています。
MSDNからそれっぽい部分をいくつかピックアップすると
http://msdn.microsoft.com/en-us/library/ms737625(v=vs.85).aspx
WSAEALREADY: A nonblocking connect call is in progress on the specified socket.
Note In order to preserve backward compatibility, this error is reported as
WSAEINVAL to Windows Sockets 1.1 applications that link to either Winsock.dll or
Wsock32.dll.
WSAEINVAL: The parameter s is a listening socket.
とあるので、
o selectが正しく動いておらず、connect完了する前に処理がもどってしまうので、connectがEINVALを返している
o selectはちゃんと動いているけど、connectがトチ狂ってEISCONNを返さずにEINVALを返している
の2択なんですが、どちらなのかは切り分けできませんでした。誰か良い案があれば教えてください。
これだけではアレなので、いくつか調査報告など
w3cのhttpのサンプルコードだと、EINVALはEISCONNと同等の処理をするようになっています。
http://www.w3.org/Library/src/HTTCP.c
NetBSDのconnectにも昔EINVALを返す問題があったそうですが、どう対処したのかはよく分かりませんでした
http://mail-index.netbsd.org/netbsd-bugs/2003/08/18/0002.html
↑ なんと報告者は Kambeさん
ruby-talkでそれっぽい話をしているログをみつけたのですが、こちらも結論分からず。
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/16632
=end
--
http://bugs.ruby-lang.org/