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