diff options
author | Eric Wong <e@80x24.org> | 2013-10-22 01:36:58 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2013-10-22 01:43:44 +0000 |
commit | 55710a182bb074513abf616697a2c38890c285d2 (patch) | |
tree | 9c6bfa74204a95c6d4b0d6f2fb7fcf0ebb91b9eb /lib/yahns/server.rb | |
parent | 77a855a075883535fe2028ed8a57425b23b8293a (diff) | |
download | yahns-55710a182bb074513abf616697a2c38890c285d2.tar.gz |
This could still be useful since new listeners may be newly shut down and the socket is still in the process of being released in the kernel.
Diffstat (limited to 'lib/yahns/server.rb')
-rw-r--r-- | lib/yahns/server.rb | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/lib/yahns/server.rb b/lib/yahns/server.rb index 8a2c9ae..63b45e9 100644 --- a/lib/yahns/server.rb +++ b/lib/yahns/server.rb @@ -132,6 +132,8 @@ class Yahns::Server # :nodoc: def listen(address) address = @config.expand_addr(address) return if String === address && listener_names.include?(address) + delay = 0.5 + tries = 5 begin io = bind_listen(address, sock_opts(address)) @@ -141,10 +143,16 @@ class Yahns::Server # :nodoc: @logger.info "listening on addr=#{sock_name(io)} fd=#{io.fileno}" @listeners << io io - rescue Errno::EADDRINUSE - @logger.error "adding listener failed addr=#{address} (in use)" - @logger.error "YAHNS_FD=#{ENV['YAHNS_FD']}" - system(*%W(lsof -p #$$)) + rescue Errno::EADDRINUSE => err + if tries == 0 + @logger.error "adding listener failed addr=#{address} (in use)" + raise err + end + tries -= 1 + @logger.warn "retrying in #{delay} seconds " \ + "(#{tries < 0 ? 'infinite' : tries} tries left)" + sleep(delay) + retry rescue => err @logger.fatal "error adding listener addr=#{address}" raise err |