Project

General

Profile

Actions

Bug #3674

closed

dRuby サーバプロセスを停止する時に時間がかかることがある

Added by nagachika (Tomoyuki Chikanaga) over 14 years ago. Updated over 13 years ago.

Status:
Closed
Target version:
ruby -v:
-
Backport:

Description

=begin
CentOS release 5.4 Linux のマシンで dRuby のサーバプロセスを停止させる時に CPU 利用した状態で
数秒から十数秒程度時間がかかることがあります。
Redhat Enterprise Linux, Ubuntu 8.10, openSUSE 11.1 等の他の環境で同じものを動かしていますが
今のところこの現象がみられるのは CentOS のところだけのようです。
(CPU の種類/速度や libpthread のバージョンも異なるのでその影響もあるかもしれません)

たとえば以下のようなサンプルでも稀に発生します。

  • server.rb
    require "drb"

class S
def m1
puts "S#m1 called"
sleep 10
end
end

begin
front = S.new
uri = ARGV[0] || "druby://localhost:0"
puts DRb.start_service(uri, front).uri

DRb.thread.join
rescue Interrupt
ensure
DRb.stop_service
end

  • client.rb
    require "drb"

obj = DRbObject.new_with_uri ARGV[0]
obj.m1

  • 実行例
    $ ruby server.rb druby://localhost:10000
    druby://localhost:10000
    S#m1 called
    <- Ctrl-C で中断

(別端末で実行)
$ ruby client.rb druby://localhost:10000

発生した時に gdb attach してみると DRbServer#kill_sub_thread で dRuby 要求を処理している
Thread を kill して回っているところで止まっているようです。
以下のように Thread.pass を挿入すると発生しなくなりました。

Index: lib/drb/drb.rb

--- lib/drb/drb.rb (revision 28880)
+++ lib/drb/drb.rb (working copy)
@@ -1421,6 +1421,7 @@
list.each do |th|
th.kill if th.alive?
end

  •     Thread.pass
        list = @grp.list
      end
     end
    

=end

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0