about summary refs log tree commit homepage
path: root/lib/yahns/server.rb
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2013-10-22 01:36:58 +0000
committerEric Wong <e@80x24.org>2013-10-22 01:43:44 +0000
commit55710a182bb074513abf616697a2c38890c285d2 (patch)
tree9c6bfa74204a95c6d4b0d6f2fb7fcf0ebb91b9eb /lib/yahns/server.rb
parent77a855a075883535fe2028ed8a57425b23b8293a (diff)
downloadyahns-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.rb16
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