[#23717] error at TestDRbMServer (test/drb) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。どうしても原因がわからないので、報告だけ・・・

18 messages 2004/06/19
[#23718] Re: error at TestDRbMServer (test/drb) — nobu.nakada@... 2004/06/19

なかだです。

[#23719] Re: error at TestDRbMServer (test/drb) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/06/19

山本です。

[#23720] Re: error at TestDRbMServer (test/drb) — nobu.nakada@... 2004/06/19

なかだです。

[#23724] Re: error at TestDRbMServer (test/drb) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/06/19

山本です。

[#23762] Ruby 1.8.2 to be released. — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

40 messages 2004/06/23

[#23784] URI() — Tanaka Akira <akr@...17n.org>

前から思っていたのですが、URI.parse("http://...") を URI("http://...")

19 messages 2004/06/25

[ruby-dev:23726] Re: error at TestDRbMServer (test/drb)

From: "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
Date: 2004-06-19 13:18:59 UTC
List: ruby-dev #23726
山本です。

どうにか、下のパッチでテストが通るようになりました。

ただ、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


In This Thread