From: "H.Yamamoto" Date: 2004-06-19T22:18:59+09:00 Subject: [ruby-dev:23726] Re: error at TestDRbMServer (test/drb) 山本です。 どうにか、下のパッチでテストが通るようになりました。 ただ、bcc32では現在 Errno::EINVAL が出ていますが、io.c(2418) をいじって Errno::EMFILE にしたほうがいいと思います。(今回はとりあえず EINVAL として パッチを組みました) また、とりあえずテストを通すことだけ考えて組んだので、問題があるかもしれません。 * EMFILE, ENFILE(と EINVAL)が出たときは、プールの中で最も古いソケットを閉じて、 リトライするようにした * プールが一杯のときは、最も古いソケットをクローズしてプールを空けるようにした Index: drb.rb =================================================================== RCS file: /var/cvs/src/ruby/lib/drb/drb.rb,v retrieving revision 1.19 diff -u -w -b -p -r1.19 drb.rb --- drb.rb 16 May 2004 15:09:52 -0000 1.19 +++ drb.rb 19 Jun 2004 13:07:17 -0000 @@ -702,6 +702,8 @@ module DRb rescue DRbBadScheme rescue DRbConnError raise($!) + rescue Errno::EINVAL, Errno::ENFILE, Errno::EMFILE + raise($!) rescue raise(DRbConnError, "#{uri} - #{$!.inspect}") end @@ -1075,16 +1077,29 @@ module DRb @pool = new_pool end - conn = self.new(remote_uri) unless conn + until conn + begin + conn = self.new(remote_uri) + rescue Errno::EINVAL, Errno::ENFILE, Errno::EMFILE + @mutex.synchronize do + raise(DRbConnError, "#{remote_uri} - #{$!.inspect}") if @pool.empty? + @pool.pop.close + end + end + end + succ, result = yield(conn) return succ, result ensure + if conn @mutex.synchronize do - if @pool.size > POOL_SIZE or ! succ - conn.close if conn - else + if succ @pool.unshift(conn) + @pool.pop.close if @pool.size > POOL_SIZE + else + conn.close + end end end end