Advertisement
otterley

unicorn.rb - safe reload

Nov 26th, 2013
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 1.23 KB | None | 0 0
  1. children = 40 # as desired
  2. min_children = 2 # as desired
  3.  
  4. after_fork do |server, worker|
  5.   # on re-deploys, want new workers to start up one at a time first, check if new master was re-deployed
  6.   if ENV['UNICORN_FD']
  7.     # second, check if still in a re-deploy
  8.     old_pid = "#{server.config[:pid]}.oldbin"
  9.     if File.exists?(old_pid) && server.pid != old_pid
  10.       # kill an old worker|master only when a couple new workers are fully running
  11.       if worker.nr >= min_children
  12.         begin
  13.           # kill an old worker if this is not the last new worker
  14.           # kill the old master if this is the last worker
  15.           Process.kill(worker.nr >= (children - 1) ? :QUIT : :TTOU, File.read(old_pid).to_i)
  16.         rescue Errno::ENOENT, Errno::ESRCH
  17.           # someone else did our job for us
  18.         end
  19.       end
  20.  
  21.       # start a new worker if this is not the last new worker
  22.       if worker.nr < (children - 1)
  23.         # first new worker must sleep to let new master finish new worker forking and install signal handlers
  24.         if worker.nr == 0 then sleep 5 end
  25.  
  26.         # signal for a new worker
  27.         new_pid = "#{server.config[:pid]}"
  28.         Process.kill(:TTIN, File.read(new_pid).to_i)
  29.       end
  30.     end
  31.   end
  32. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement