[Ruby 1.9 - Bug #4387][Rejected] test socket connect nonblock(TestSocketAddrinfo) がまれに失敗する

Issue #4387 has been updated by Motohiro KOSAKI.

Status changed from Open to Rejected

進展する気がしないので、いったんrejectしますね。

Bug #4387: test_socket_connect_nonblock(TestSocketAddrinfo) がまれに失敗する

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が以下のエラーを吐きます

  1. 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からそれっぽい部分をいくつかピックアップすると
connect function (winsock2.h) - Win32 apps | Microsoft Learn

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を返す問題があったそうですが、どう対処したのかはよく分かりませんでした
netbsd-bugs: kern/22522: connect(2) may fail with EINVAL which isn't undocumented.
↑ なんと報告者は Kambeさん

ruby-talkでそれっぽい話をしているログをみつけたのですが、こちらも結論分からず。
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/16632
=end