たぶんそれはconnectが終わった上で、スレッドが終了し、GCが走ってcloseされてませんかね。接続を無視するホストに対してconnectしてみればconnectに時間がかかるので、Thread#killしてもなかなか死なないのが観測できますし、GC.disableすればfdが開きっぱなしなんじゃないかな…どちらも試してないのでたぶんですが…
11.08.2023 13:35
👍 1
🔁 0
💬 1
📌 0
たぶんそれはconnectが終わった上で、スレッドが終了し、GCが走ってcloseされてませんかね。接続を無視するホストに対してconnectしてみればconnectに時間がかかるので、Thread#killしてもなかなか死なないのが観測できますし、GC.disableすればfdが開きっぱなしなんじゃないかな…どちらも試してないのでたぶんですが…
connect(2)の最中にRuby threadを中断する方法がないと仰っているんだと思います。
実際には、例えばLinuxならthread単位でsignalを送ることでEINTRで中断させることは出来ます。もっともRubyにはthread単位にsignalを扱う機能はないので別の方法を考える必要があます。
他にはconnect_nonblockがあり、connect_nonblockで開きまくってからIO.selectで繋がったやつをゲットできるんじゃないかと思います
端的にはRubyのリポジトリを git grep WaitWritable して頂くといいと思うんですが、EGAINやEWOULDBLOCKつまり実行中にシグナルで割り込みがかかったとかですかね。あとはOpenSSLでラップされてるパターンがあります
EINPROGRESS以外にも例外返ってきませんっけ
ハングというか受信待ちだったりしませんか