ruby-dev (Japanese) list archive (unofficial mirror)
 help / color / mirror / Atom feed
* [ruby-dev:43462] [Ruby 1.9 - Bug #4387][Rejected] test_socket_connect_nonblock(TestSocketAddrinfo) がまれに失敗する
       [not found] <redmine.issue-4387.20110210045336@ruby-lang.org>
@ 2011-05-03 12:50 ` Motohiro KOSAKI
  2012-05-19 22:58 ` [ruby-dev:45658] [ruby-trunk - Bug #4387][Feedback] " naruse (Yui NARUSE)
  2012-10-27  0:28 ` [ruby-dev:46290] [ruby-trunk - Bug #4387] " ko1 (Koichi Sasada)
  2 siblings, 0 replies; 4+ messages in thread
From: Motohiro KOSAKI @ 2011-05-03 12:50 UTC (permalink / raw
  To: ruby developers list


Issue #4387 has been updated by Motohiro KOSAKI.

Status changed from Open to Rejected

進展する気がしないので、いったんrejectしますね。
----------------------------------------
Bug #4387: test_socket_connect_nonblock(TestSocketAddrinfo) がまれに失敗する
http://redmine.ruby-lang.org/issues/4387

Author: Motohiro KOSAKI
Status: Rejected
Priority: Normal
Assignee: 
Category: core
Target version: 1.9.x
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://redmine.ruby-lang.org

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [ruby-dev:45658] [ruby-trunk - Bug #4387][Feedback] test_socket_connect_nonblock(TestSocketAddrinfo) がまれに失敗する
       [not found] <redmine.issue-4387.20110210045336@ruby-lang.org>
  2011-05-03 12:50 ` [ruby-dev:43462] [Ruby 1.9 - Bug #4387][Rejected] test_socket_connect_nonblock(TestSocketAddrinfo) がまれに失敗する Motohiro KOSAKI
@ 2012-05-19 22:58 ` naruse (Yui NARUSE)
  2012-05-30 13:59   ` [ruby-dev:45693] " Takahiro Kambe
  2012-10-27  0:28 ` [ruby-dev:46290] [ruby-trunk - Bug #4387] " ko1 (Koichi Sasada)
  2 siblings, 1 reply; 4+ messages in thread
From: naruse (Yui NARUSE) @ 2012-05-19 22:58 UTC (permalink / raw
  To: ruby developers list


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/

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [ruby-dev:45693] Re: [ruby-trunk - Bug #4387][Feedback] test_socket_connect_nonblock(TestSocketAddrinfo) がまれに失敗する
  2012-05-19 22:58 ` [ruby-dev:45658] [ruby-trunk - Bug #4387][Feedback] " naruse (Yui NARUSE)
@ 2012-05-30 13:59   ` Takahiro Kambe
  0 siblings, 0 replies; 4+ messages in thread
From: Takahiro Kambe @ 2012-05-30 13:59 UTC (permalink / raw
  To: ruby developers list

In message <redmine.journal-26722.20120520075850@ruby-lang.org>
	on Sun, 20 May 2012 07:58:51 +0900,
	"naruse (Yui NARUSE)" <naruse@airemix•jp> wrote:
> [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 が返ってきました。
...(snip)...
>  これだけではアレなので、いくつか調査報告など
>  
>  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-list での議論を受けて報告したものですが、華麗に
無視されて今日に至っておりますな。

-- 
神戸 隆博 / Takahiro Kambe 

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [ruby-dev:46290] [ruby-trunk - Bug #4387] test_socket_connect_nonblock(TestSocketAddrinfo) がまれに失敗する
       [not found] <redmine.issue-4387.20110210045336@ruby-lang.org>
  2011-05-03 12:50 ` [ruby-dev:43462] [Ruby 1.9 - Bug #4387][Rejected] test_socket_connect_nonblock(TestSocketAddrinfo) がまれに失敗する Motohiro KOSAKI
  2012-05-19 22:58 ` [ruby-dev:45658] [ruby-trunk - Bug #4387][Feedback] " naruse (Yui NARUSE)
@ 2012-10-27  0:28 ` ko1 (Koichi Sasada)
  2 siblings, 0 replies; 4+ messages in thread
From: ko1 (Koichi Sasada) @ 2012-10-27  0:28 UTC (permalink / raw
  To: ruby developers list


Issue #4387 has been updated by ko1 (Koichi Sasada).

Assignee set to naruse (Yui NARUSE)

誰に押しつけたモノだか迷ったのですが,とりあえず詳しそうななるせさんに振りました.
これ,どうするべきでしょうか.
----------------------------------------
Bug #4387: test_socket_connect_nonblock(TestSocketAddrinfo) がまれに失敗する
https://bugs.ruby-lang.org/issues/4387#change-31730

Author: kosaki (Motohiro KOSAKI)
Status: Feedback
Priority: Normal
Assignee: naruse (Yui NARUSE)
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/

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2012-10-27  0:17 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <redmine.issue-4387.20110210045336@ruby-lang.org>
2011-05-03 12:50 ` [ruby-dev:43462] [Ruby 1.9 - Bug #4387][Rejected] test_socket_connect_nonblock(TestSocketAddrinfo) がまれに失敗する Motohiro KOSAKI
2012-05-19 22:58 ` [ruby-dev:45658] [ruby-trunk - Bug #4387][Feedback] " naruse (Yui NARUSE)
2012-05-30 13:59   ` [ruby-dev:45693] " Takahiro Kambe
2012-10-27  0:28 ` [ruby-dev:46290] [ruby-trunk - Bug #4387] " ko1 (Koichi Sasada)

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).