From: Masatoshi SEKI Date: 2012-04-22T06:52:35+09:00 Subject: [ruby-dev:45542] Re: drb SSL test timeout 咳といいます。 On 2012/04/22, at 2:43, Tanaka Akira wrote: > Debian wheezy において、test_drbssl.rb のテストで 100秒の timeout にひっかかります。 > また、そのとき、プロセスが残ります。 > 調べたところ、TCP の accept に成功した後、SSL の accept に失敗しているようです。 > とりあえずその状況で TCP のソケットを close すれば、 > タイムアウトじゃなくてすみやかに失敗するようにできました。 > > % svn diff --diff-cmd diff -x '-u -p' > Index: lib/drb/ssl.rb > =================================================================== > --- lib/drb/ssl.rb (revision 35418) > +++ lib/drb/ssl.rb (working copy) > @@ -177,7 +177,11 @@ module DRb > break if (@acl ? @acl.allow_socket?(soc) : true) > soc.close > end > - ssl = @config.accept(soc) > + begin > + ssl = @config.accept(soc) > + ensure > + soc.close if $! > + end > self.class.new(uri, ssl, @config, true) > rescue OpenSSL::SSL::SSLError > warn("#{__FILE__}:#{__LINE__}: warning: #{$!.message} > (#{$!.class})") if @config[:verbose] > > この状況で TCP のソケットを close することは正しい対処だとと思うのですが、いかがでしょうか。 正しいと思います。田中さんcommitしたいただけますか? こういうensureと$!を組み合わせるのはとても面白いですね。 例外があがるのを妨げずに、例外に気付けるのかしら。 > > なお、この変更後は下のように、実際の問題と思われる OpenSSL::SSL::SSLError でテストが失敗するようになります。 > > > あとこの変更では、プロセスが残るのはそのままです。 > drb が起動したプロセス (あるいは Process.detach が返したスレッド) を覚えていてくれると > kill できるような気がするんですが、どうでしょうか。 すみません。どうしたらいいか考えます。