From: Yusuke ENDOH Date: 2010-02-17T22:15:33+09:00 Subject: [ruby-dev:40440] repeat of DRb.start_service and DRb.stop_service may result in EADDRINUSE 咳さん 遠藤です。 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
' from -e:2:in `loop' from -e:2:in `
' 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