From 3e701ee74ff29bdf5daa3249acede5a85a2b0097 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 17 Jan 2014 02:03:04 +0000 Subject: unicorn 4.8 compatibility + test version bumps Internal reworking of unicorn 4.8.0 completely broke us(!). This commit fixes things, but it means we no longer support unicorn <= 4.7. Sorry about that. --- lib/rainbows.rb | 5 ++++- lib/rainbows/base.rb | 19 ++++++++++++++----- 2 files changed, 18 insertions(+), 6 deletions(-) (limited to 'lib') diff --git a/lib/rainbows.rb b/lib/rainbows.rb index bfa1ba0..82a8448 100644 --- a/lib/rainbows.rb +++ b/lib/rainbows.rb @@ -55,6 +55,7 @@ module Rainbows attr_reader :alive attr_writer :worker attr_writer :forked + attr_writer :readers end def self.config!(mod, *opts) @@ -88,7 +89,9 @@ module Rainbows @alive = false Rainbows::HttpParser.quit @expire = Time.now + (@server.timeout * 2.0) - Unicorn::HttpServer::LISTENERS.each { |s| s.close rescue nil }.clear + tmp = @readers.dup + @readers.clear + tmp.each { |s| s.close rescue nil }.clear @at_quit.each { |task| task.call } end false diff --git a/lib/rainbows/base.rb b/lib/rainbows/base.rb index 54f1d2d..a7ba17d 100644 --- a/lib/rainbows/base.rb +++ b/lib/rainbows/base.rb @@ -8,24 +8,33 @@ module Rainbows::Base # :stopdoc: + def sig_receiver(worker) + begin + worker.to_io.kgio_wait_readable + worker.kgio_tryaccept # Unicorn::Worker#kgio_tryaccept + rescue => e + Rainbows.alive or return + Unicorn.log_error(Rainbows.server.logger, "signal receiver", e) + end while true + end + # this method is called by all current concurrency models def init_worker_process(worker) # :nodoc: - super(worker) + readers = super(worker) Rainbows::Response.setup Rainbows::MaxBody.setup Rainbows.worker = worker - # we're don't use the self-pipe mechanism in the Rainbows! worker - # since we don't defer reopening logs - Rainbows::HttpServer::SELF_PIPE.each { |x| x.close }.clear - # spawn Threads since Logger takes a mutex by default and # we can't safely lock a mutex in a signal handler trap(:USR1) { Thread.new { reopen_worker_logs(worker.nr) } } trap(:QUIT) { Thread.new { Rainbows.quit! } } [:TERM, :INT].each { |sig| trap(sig) { exit!(0) } } # instant shutdown Rainbows::ProcessClient.const_set(:APP, Rainbows.server.app) + Thread.new { sig_receiver(worker) } logger.info "Rainbows! #@use worker_connections=#@worker_connections" + Rainbows.readers = readers # for Rainbows.quit + readers # unicorn 4.8+ needs this end def process_client(client) -- cgit v1.2.3-24-ge0c7