Bug #496: DRb.start_service(nil) is very slow
http://redmine.ruby-lang.org/issues/show/496
Author: Hongli Lai
Status: Open, Priority: Normal
On some systems - such as mine - DRB.start_service(nil) is very slow. This is caused by the fact that DRb.open_server calls TCPServer.open(nil, 0).addr[1]. On my system, this takes about 3 seconds, and during those 3 seconds there is 0% CPU usage.
I suspect it has got something to do with the fact that retrieving the port of a server socket that's bound to 0.0.0.0 is for some unknown reason very slow.
The problem can be fixed by replacing the following line in drb.rb
uri = 'druby://:0' unless uri
with:
uri = 'druby://localhost:0' unless uri
This does not violate DRb.start_service's contract, because a nil indicates that it will bind to the default local host name.
The following monkeypatch works around the issue:
module DRb
class << self
alias orig_start_service start_service
end
def self.start_service(uri = nil, front = nil, config = nil)
if uri.nil?
orig_start_service("druby://localhost:0", front, config)
else
orig_start_service(uri, front, config)
end
end
end
----------------------------------------
http://redmine.ruby-lang.org