Cluster::restart doesn't wait for stop before starting


I’m calling restart from my Capistrano task. I have this in my deploy.rb

until mongrel_cluster updates to cap2…

namespace :deploy do
task :start, :roles => :app do start_mongrel_cluster end
task :stop, :roles => :app do stop_mongrel_cluster end
task :restart, :roles => :app do restart_mongrel_cluster end

(What’s the scoop on mongrel_cluster with Capistrano 2 by the way?)

The command that’s executed with a restart is:

sudo mongrel_rails cluster::restart -C /etc/mongrel_cluster/staging.yml

** [out ::] stopping port 8010
** [out ::] already started port 8010

At this point the server is not running – I conclude that it has been
stopped successfully. Now if I call on “start” it starts properly
without an “already started” warning.

This happens intermittently. Sometimes it restarts fine. If I call
stop/start manually, it works because I guess I’m leaving enough time
in between for it to shut down.

Any thoughts on this?

capistrano 2.0.0
mongrel 1.0.1
mongrel_rails 1.0.2

–Andrew V.

It would be good if it were redesigned to listen for the mongrel to
before starting it again, every time I stop our front end mongrels one
two of them don’t stop quick enough (there are a lot of 1/2-1 sec pages)
i’m pressing up/enter/up/enter/up/enter to start them up again as fast
(anyway, what i meant to add was its not a Capistrano issue alone)

We notice this a lot in our environment because some mongrels in the
cluster are assigned to handle image magick tasks and can take a while
to acknowledge the TERM signal.

From my understanding mongrel_rails cluster::restart sends a TERM to
each mongel, which causes it to wait for the currently processing
request to finish, then closes the connections of the other requests
outstanding. If this doesn’t happen straight away then you’ll get the
already started message.

The solution to me would seam to give cluster::restart an optional
delay parameter so those slow mongrels can catch up.