[ruby-dev:40440] repeat of DRb.start_service and DRb.stop_service may result in EADDRINUSE

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

[ruby-dev:40440] repeat of DRb.start_service and DRb.stop_service may result in EADDRINUSE

Yusuke ENDOH
咳さん
遠藤です。

1.9 で、DRb.start_service と stop_service を繰り返すと、EADDRINUSE が
発生することがあります。

  $ ./ruby -Ilib -rdrb -e '
  loop do
    p :start
    DRb.start_service("druby://localhost:9090", 1)
    DRb.stop_service
  end
  '
  :start
  :start
  :start
  /home/mame/work/ruby19/ruby/lib/drb/drb.rb:861:in `initialize':
Address already in use - bind(2) (Errno::EADDRINUSE)
          from /home/mame/work/ruby19/ruby/lib/drb/drb.rb:861:in `open'
          from /home/mame/work/ruby19/ruby/lib/drb/drb.rb:861:in `open_server'
          from /home/mame/work/ruby19/ruby/lib/drb/drb.rb:759:in
`block in open_server'
          from /home/mame/work/ruby19/ruby/lib/drb/drb.rb:757:in `each'
          from /home/mame/work/ruby19/ruby/lib/drb/drb.rb:757:in `open_server'
          from /home/mame/work/ruby19/ruby/lib/drb/drb.rb:1342:in `initialize'
          from /home/mame/work/ruby19/ruby/lib/drb/drb.rb:1630:in `new'
          from /home/mame/work/ruby19/ruby/lib/drb/drb.rb:1630:in
`start_service'
          from -e:4:in `block in <main>'
          from -e:2:in `loop'
          from -e:2:in `<main>'

Thread#kill でサービスを停止しているようですが、kill した後 join しない
と確実に死んだかどうかわからないと思います。1.8 ではタイミングがたまたま
問題になっていないだけな気がします。

rubyspec がたまに失敗して鬱陶しいので、もしよければ直したいです。以下の
パッチで直ります。

diff --git a/lib/drb/drb.rb b/lib/drb/drb.rb
index a2c11f9..4712306 100644
--- a/lib/drb/drb.rb
+++ b/lib/drb/drb.rb
@@ -1394,7 +1394,7 @@ module DRb
       if  Thread.current['DRb'] && Thread.current['DRb']['server'] == self
         Thread.current['DRb']['stop_service'] = true
       else
-        @thread.kill
+        @thread.kill.join
       end
     end


--
Yusuke ENDOH <[hidden email]>

Reply | Threaded
Open this post in threaded view
|

[ruby-dev:40441] Re: repeat of DRb.start_service and DRb.stop_service may result in EADDRINUSE

Masatoshi SEKI
咳といいます。

On 2010/02/17, at 22:15, Yusuke ENDOH wrote:

> Thread#kill でサービスを停止しているようですが、kill した後 join しない
> と確実に死んだかどうかわからないと思います。1.8 ではタイミングがたまたま
> 問題になっていないだけな気がします。
>
> rubyspec がたまに失敗して鬱陶しいので、もしよければ直したいです。以下の
> パッチで直ります。
>
> diff --git a/lib/drb/drb.rb b/lib/drb/drb.rb
> index a2c11f9..4712306 100644
> --- a/lib/drb/drb.rb
> +++ b/lib/drb/drb.rb
> @@ -1394,7 +1394,7 @@ module DRb
>       if  Thread.current['DRb'] && Thread.current['DRb']['server'] == self
>         Thread.current['DRb']['stop_service'] = true
>       else
> -        @thread.kill
> +        @thread.kill.join
>       end
>     end


Thread#killは終了を待つわけじゃないのかー。

ありがとうございます。
今日明日は作業できそうにないので、遠藤さんcommitをお願いできますか?

完全な終了、というのがどの程度できてるのかあやしいような気がする
のですが、それは件のRubySpecでは問題ないでしょう。










Reply | Threaded
Open this post in threaded view
|

[ruby-dev:40446] Re: repeat of DRb.start_service and DRb.stop_service may result in EADDRINUSE

Yusuke ENDOH
遠藤です。

2010年2月18日7:41 Masatoshi SEKI <[hidden email]>:
> On 2010/02/17, at 22:15, Yusuke ENDOH wrote:
>
>> Thread#kill でサービスを停止しているようですが、kill した後 join しない
>> と確実に死んだかどうかわからないと思います。1.8 ではタイミングがたまたま
>> 問題になっていないだけな気がします。
>>
>> rubyspec がたまに失敗して鬱陶しいので、もしよければ直したいです。以下の
>> パッチで直ります。
>>
*snip*
>
> Thread#killは終了を待つわけじゃないのかー。
>
> ありがとうございます。
> 今日明日は作業できそうにないので、遠藤さんcommitをお願いできますか?

即答ありがとうございます。コミットしました。


> 完全な終了、というのがどの程度できてるのかあやしいような気がする
> のですが、それは件のRubySpecでは問題ないでしょう。

そう思います。

drb の spec は erb と違ってまだほとんど書かれてないようなので、
ひょっとしたらそのうち何か問題が洗い出されるかもしれません。

--
Yusuke ENDOH <[hidden email]>