* Re: Problem restarting Unicorn
2012-04-05 7:21 3% Problem restarting Unicorn Andrew Stewart
@ 2012-04-05 11:34 0% ` Michael Guterl
0 siblings, 0 replies; 4+ results
From: Michael Guterl @ 2012-04-05 11:34 UTC (permalink / raw)
To: unicorn list
On Thu, Apr 5, 2012 at 3:21 AM, Andrew Stewart
<boss@airbladesoftware.com> wrote:
> Hello,
>
> I seem to be confused about how to restart Unicorn when deploying updates to a Rails app via Capistrano.
>
> I just had a problem where a bundled gem wasn't being seen by the Unicorn processes, even though app code I introduced at the same time was being served by the Unicorn processes. I had restarted Unicorn numerous times using `bundle exec cap deploy:restart` (see the code below), which I thought was the right way to do zero-downtime restarts, but my problem was only solved by doing a hard restart of Unicorn with `bundle exec cap deploy:hard_restart`.
>
> With each "normal" restart I tailed the stderr log to check everything was ok; everything appeared fine, with gems refreshed etc.
>
> Please could somebody explain what I'm doing wrong with my normal restarts?
>
> config/deploy.rb:
>
> set :unicorn_config, "#{current_path}/config/unicorn.rb"
> set :unicorn_pid, "#{shared_path}/pids/unicorn.pid"
>
> namespace :deploy do
> task :start, :roles => :app, :except => { :no_release => true } do
> run "cd #{current_path} && #{sudo_workaround} bundle exec unicorn -c #{unicorn_config} -E #{rails_env} -D"
> end
> task :stop, :roles => :app, :except => { :no_release => true } do
> run "#{sudo_workaround} kill -s QUIT `cat #{unicorn_pid}`"
> end
> task :hard_stop, :roles => :app, :except => { :no_release => true } do
> run "#{sudo_workaround} kill `cat #{unicorn_pid}`"
> end
> task :restart, :roles => :app, :except => { :no_release => true } do
> run "#{sudo_workaround} kill -s USR2 `cat #{unicorn_pid}`"
> end
> task :hard_restart, :roles => :app, :except => { :no_release => true } do
> hard_stop
> start
> end
> end
>
> # Works around Ubuntu changing the PATH when you use sudo.
> # sudo's path can find common commands like echo but not much else.
> def sudo_workaround
> "sudo env PATH=$PATH"
> end
>
>
> config/unicorn.rb:
>
> APP_PATH = '/var/www/apps/sparkle'
> worker_processes 4
> user 'rails', 'rails'
> working_directory "#{APP_PATH}/current"
> listen "/tmp/unicorn_sparkle.sock", :backlog => 64
> timeout 30
> pid "#{APP_PATH}/shared/pids/unicorn.pid"
> stderr_path "#{APP_PATH}/shared/log/unicorn.stderr.log"
> stdout_path "#{APP_PATH}/shared/log/unicorn.stdout.log"
> preload_app true
> GC.respond_to?(:copy_on_write_friendly=) and GC.copy_on_write_friendly = true
>
> before_fork do |server, worker|
> defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!
>
> old_pid = "#{server.config[:pid]}.oldbin"
> if old_pid != server.pid
> begin
> sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
> Process.kill(sig, File.read(old_pid).to_i)
> rescue Errno::ENOENT, Errno::ESRCH
> end
> end
> end
>
> after_fork do |server, worker|
> defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
> end
>
> This is all with Unicorn 4.2.0 and Rails 3.0.11.
>
> Many thanks in advance,
>
You probably want to check out the Sandbox documentation here:
http://unicorn.bogomips.org/Sandbox.html
The section that I think is most relevant is related to setting the START_CTX:
Unicorn::HttpServer::START_CTX[0] = "/some/path/to/bin/unicorn"
Hope that helps.
Best,
Michael Guterl
_______________________________________________
Unicorn mailing list - mongrel-unicorn@rubyforge.org
http://rubyforge.org/mailman/listinfo/mongrel-unicorn
Do not quote signatures (like this one) or top post when replying
^ permalink raw reply [relevance 0%]
* Problem restarting Unicorn
@ 2012-04-05 7:21 3% Andrew Stewart
2012-04-05 11:34 0% ` Michael Guterl
0 siblings, 1 reply; 4+ results
From: Andrew Stewart @ 2012-04-05 7:21 UTC (permalink / raw)
To: mongrel-unicorn
Hello,
I seem to be confused about how to restart Unicorn when deploying updates to a Rails app via Capistrano.
I just had a problem where a bundled gem wasn't being seen by the Unicorn processes, even though app code I introduced at the same time was being served by the Unicorn processes. I had restarted Unicorn numerous times using `bundle exec cap deploy:restart` (see the code below), which I thought was the right way to do zero-downtime restarts, but my problem was only solved by doing a hard restart of Unicorn with `bundle exec cap deploy:hard_restart`.
With each "normal" restart I tailed the stderr log to check everything was ok; everything appeared fine, with gems refreshed etc.
Please could somebody explain what I'm doing wrong with my normal restarts?
config/deploy.rb:
set :unicorn_config, "#{current_path}/config/unicorn.rb"
set :unicorn_pid, "#{shared_path}/pids/unicorn.pid"
namespace :deploy do
task :start, :roles => :app, :except => { :no_release => true } do
run "cd #{current_path} && #{sudo_workaround} bundle exec unicorn -c #{unicorn_config} -E #{rails_env} -D"
end
task :stop, :roles => :app, :except => { :no_release => true } do
run "#{sudo_workaround} kill -s QUIT `cat #{unicorn_pid}`"
end
task :hard_stop, :roles => :app, :except => { :no_release => true } do
run "#{sudo_workaround} kill `cat #{unicorn_pid}`"
end
task :restart, :roles => :app, :except => { :no_release => true } do
run "#{sudo_workaround} kill -s USR2 `cat #{unicorn_pid}`"
end
task :hard_restart, :roles => :app, :except => { :no_release => true } do
hard_stop
start
end
end
# Works around Ubuntu changing the PATH when you use sudo.
# sudo's path can find common commands like echo but not much else.
def sudo_workaround
"sudo env PATH=$PATH"
end
config/unicorn.rb:
APP_PATH = '/var/www/apps/sparkle'
worker_processes 4
user 'rails', 'rails'
working_directory "#{APP_PATH}/current"
listen "/tmp/unicorn_sparkle.sock", :backlog => 64
timeout 30
pid "#{APP_PATH}/shared/pids/unicorn.pid"
stderr_path "#{APP_PATH}/shared/log/unicorn.stderr.log"
stdout_path "#{APP_PATH}/shared/log/unicorn.stdout.log"
preload_app true
GC.respond_to?(:copy_on_write_friendly=) and GC.copy_on_write_friendly = true
before_fork do |server, worker|
defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!
old_pid = "#{server.config[:pid]}.oldbin"
if old_pid != server.pid
begin
sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
Process.kill(sig, File.read(old_pid).to_i)
rescue Errno::ENOENT, Errno::ESRCH
end
end
end
after_fork do |server, worker|
defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end
This is all with Unicorn 4.2.0 and Rails 3.0.11.
Many thanks in advance,
Andy Stewart
----
http://airbladesoftware.com
_______________________________________________
Unicorn mailing list - mongrel-unicorn@rubyforge.org
http://rubyforge.org/mailman/listinfo/mongrel-unicorn
Do not quote signatures (like this one) or top post when replying
^ permalink raw reply [relevance 3%]
* [ANN] unicorn 4.2.0 - minor fixes and improvements
@ 2012-01-28 9:25 5% Eric Wong
0 siblings, 0 replies; 4+ results
From: Eric Wong @ 2012-01-28 9:25 UTC (permalink / raw)
To: mongrel-unicorn
Changes:
The GPLv3 is now an option to the Unicorn license. The existing GPLv2
and Ruby-only terms will always remain options, but the GPLv3 is
preferred.
Daemonization is correctly detected on all terminals for development
use (Brian P O'Rourke).
Unicorn::OobGC respects applications that disable GC entirely
during application dispatch (Yuichi Tateno).
Many test fixes for OpenBSD, which may help other *BSDs, too.
(Jeremy Evans).
There is now _optional_ SSL support (via the "kgio-monkey"
RubyGem). On fast, secure LANs, SSL is only intended for
detecting data corruption that weak TCP checksums cannot detect.
Our SSL support is remains unaudited by security experts.
There are also some minor bugfixes and documentation
improvements.
Ruby 2.0.0dev also has a copy-on-write friendly GC which can save memory
when combined with "preload_app true", so if you're in the mood, start
testing Unicorn with the latest Ruby!
* http://unicorn.bogomips.org/
* mongrel-unicorn@rubyforge.org
* git://bogomips.org/unicorn.git
* http://unicorn.bogomips.org/NEWS.atom.xml
_______________________________________________
Unicorn mailing list - mongrel-unicorn@rubyforge.org
http://rubyforge.org/mailman/listinfo/mongrel-unicorn
Do not quote signatures (like this one) or top post when replying
^ permalink raw reply [relevance 5%]
* RE: Unicorn_rails ignores USR2 signal
@ 2012-03-30 22:16 7% ` Yeung, Jeffrey
0 siblings, 0 replies; 4+ results
From: Yeung, Jeffrey @ 2012-03-30 22:16 UTC (permalink / raw)
To: Eric Wong, unicorn list
I have little to report, unfortunately. I still have not identified what is trapping USR2 in my application, if something is indeed doing that.
I've attempted to do a bit more investigation work in my spare time this week, and the results are still rather mysterious.
First, I applied your patch to http_server.rb that you suggested in this thread back on March 9th (quoted below), which re-overrides the signal handlers in build_app!(). The patch did work. Okay, that seems to reconfirm that the app is doing something with the USR2 signal handler...
Then I modified the master_siginit() method a bit further to provide more info:
def master_siginit
QUEUE_SIGS.each { |sig|
old_handler = trap(sig) { SIG_QUEUE << sig; awaken_master }
logger.info("old handler for #{sig.to_s}: #{old_handler.inspect}")
}
trap(:CHLD) { awaken_master }
end
And the output was a bit surprising. Here is the Unicorn stderr log when starting up the service. master_siginit() is called twice, as expected...
I, [2012-03-30T14:57:51.301839 #15828] INFO -- : listening on addr=0.0.0.0:8080 fd=3
I, [2012-03-30T14:57:51.302341 #15828] INFO -- : old handler for WINCH: nil
I, [2012-03-30T14:57:51.302435 #15828] INFO -- : old handler for QUIT: "DEFAULT"
I, [2012-03-30T14:57:51.302505 #15828] INFO -- : old handler for INT: "DEFAULT"
I, [2012-03-30T14:57:51.302573 #15828] INFO -- : old handler for TERM: "DEFAULT"
I, [2012-03-30T14:57:51.302641 #15828] INFO -- : old handler for USR1: "DEFAULT"
I, [2012-03-30T14:57:51.302709 #15828] INFO -- : old handler for USR2: "DEFAULT"
I, [2012-03-30T14:57:51.302786 #15828] INFO -- : old handler for HUP: "DEFAULT"
I, [2012-03-30T14:57:51.302853 #15828] INFO -- : old handler for TTIN: nil
I, [2012-03-30T14:57:51.302917 #15828] INFO -- : old handler for TTOU: nil
I, [2012-03-30T14:57:51.303502 #15828] INFO -- : Refreshing Gem list
old handler for WINCH: #<Proc:0x00000002d97488@/usr/local/lib/ruby/gems/1.9.1/gems/unicorn-4.2.0/lib/unicorn/http_server.rb:745>
old handler for QUIT: #<Proc:0x00000002d97098@/usr/local/lib/ruby/gems/1.9.1/gems/unicorn-4.2.0/lib/unicorn/http_server.rb:745>
old handler for INT: #<Proc:0x00000002d96c70@/usr/local/lib/ruby/gems/1.9.1/gems/unicorn-4.2.0/lib/unicorn/http_server.rb:745>
old handler for TERM: #<Proc:0x00000002d96848@/usr/local/lib/ruby/gems/1.9.1/gems/unicorn-4.2.0/lib/unicorn/http_server.rb:745>
old handler for USR1: #<Proc:0x00000002d96420@/usr/local/lib/ruby/gems/1.9.1/gems/unicorn-4.2.0/lib/unicorn/http_server.rb:745>
old handler for USR2: #<Proc:0x00000002d95ff8@/usr/local/lib/ruby/gems/1.9.1/gems/unicorn-4.2.0/lib/unicorn/http_server.rb:745>
old handler for HUP: #<Proc:0x00000002d95bd0@/usr/local/lib/ruby/gems/1.9.1/gems/unicorn-4.2.0/lib/unicorn/http_server.rb:745>
old handler for TTIN: #<Proc:0x00000002d957a8@/usr/local/lib/ruby/gems/1.9.1/gems/unicorn-4.2.0/lib/unicorn/http_server.rb:745>
old handler for TTOU: #<Proc:0x00000002d953b8@/usr/local/lib/ruby/gems/1.9.1/gems/unicorn-4.2.0/lib/unicorn/http_server.rb:745>
master process ready
worker=0 ready
Which to me, looks like the USR2 handler was unchanged in the second master_siginit() call. Yet, if I remove that second master_siginit() call from there, USR2 ceases to work. :S
-Jeff
-----Original Message-----
diff --git a/lib/unicorn/http_server.rb b/lib/unicorn/http_server.rb index 7d2c623..1b9d693 100644
--- a/lib/unicorn/http_server.rb
+++ b/lib/unicorn/http_server.rb
@@ -128,8 +128,7 @@ class Unicorn::HttpServer
# setup signal handlers before writing pid file in case people get
# trigger happy and send signals as soon as the pid file exists.
# Note that signals don't actually get handled until the #join method
- QUEUE_SIGS.each { |sig| trap(sig) { SIG_QUEUE << sig; awaken_master } }
- trap(:CHLD) { awaken_master }
+ master_siginit
self.pid = config[:pid]
self.master_pid = $$
@@ -689,6 +688,9 @@ class Unicorn::HttpServer
Gem.refresh
end
self.app = app.call
+
+ # override signal handlers the app may have set
+ master_siginit if preload_app
end
end
@@ -736,4 +738,9 @@ class Unicorn::HttpServer
config_listeners.each { |addr| listen(addr) }
raise ArgumentError, "no listeners" if LISTENERS.empty?
end
+
+ def master_siginit
+ QUEUE_SIGS.each { |sig| trap(sig) { SIG_QUEUE << sig; awaken_master } }
+ trap(:CHLD) { awaken_master }
+ end
end
_______________________________________________
Unicorn mailing list - mongrel-unicorn@rubyforge.org
http://rubyforge.org/mailman/listinfo/mongrel-unicorn
Do not quote signatures (like this one) or top post when replying
^ permalink raw reply [relevance 7%]
Results 1-4 of 4 | reverse | options above
-- pct% links below jump to the message on this page, permalinks otherwise --
2012-01-28 9:25 5% [ANN] unicorn 4.2.0 - minor fixes and improvements Eric Wong
2012-04-05 7:21 3% Problem restarting Unicorn Andrew Stewart
2012-04-05 11:34 0% ` Michael Guterl
2012-03-09 21:48 Unicorn_rails ignores USR2 signal Yeung, Jeffrey
2012-03-09 22:24 ` Eric Wong
2012-03-09 22:39 ` Yeung, Jeffrey
2012-03-10 0:02 ` Eric Wong
2012-03-10 1:07 ` Yeung, Jeffrey
2012-03-10 1:30 ` Eric Wong
2012-03-12 21:21 ` Eric Wong
2012-03-12 22:39 ` Yeung, Jeffrey
2012-03-12 22:44 ` Eric Wong
2012-03-20 19:57 ` Eric Wong
2012-03-30 22:16 7% ` Yeung, Jeffrey
Code repositories for project(s) associated with this public inbox
https://yhbt.net/unicorn.git/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).