about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2009-06-30 17:47:55 -0700
committerEric Wong <normalperson@yhbt.net>2009-07-08 14:49:31 -0700
commit98e77adbdcdd96d24c98fd098d9a046f152d6535 (patch)
treead1aa11e6f8da75f0b265599dab4c16ac26768b4
parent2fbbd59ea9b47e7bbf44ba848ac017905720c2fd (diff)
downloadunicorn-98e77adbdcdd96d24c98fd098d9a046f152d6535.tar.gz
This number of retries and delay taken directly from nginx

(cherry picked from commit d247b5d95a3ad2de65cc909db21fdfbc6194b4c9)
-rw-r--r--lib/unicorn.rb13
1 files changed, 10 insertions, 3 deletions
diff --git a/lib/unicorn.rb b/lib/unicorn.rb
index 7173a29..7acc00b 100644
--- a/lib/unicorn.rb
+++ b/lib/unicorn.rb
@@ -168,16 +168,23 @@ module Unicorn
     def listen(address, opt = {}.merge(@listener_opts[address] || {}))
       return if String === address && listener_names.include?(address)
 
-      if io = bind_listen(address, opt)
+      delay, tries = 0.5, 5
+      begin
+        io = bind_listen(address, opt)
         unless TCPServer === io || UNIXServer === io
           IO_PURGATORY << io
           io = server_cast(io)
         end
         logger.info "listening on addr=#{sock_name(io)} fd=#{io.fileno}"
         LISTENERS << io
-      else
+        return io
+      rescue Errno::EADDRINUSE => err
         logger.error "adding listener failed addr=#{address} (in use)"
-        raise Errno::EADDRINUSE, address
+        raise err if tries == 0
+        tries -= 1
+        logger.error "retrying in #{delay} seconds (#{tries} tries left)"
+        sleep(delay)
+        retry
       end
     end