module Unicorn::SoftTimeout

Constants

VERSION

Public Class Methods

new(app, soft_timeout = 12) click to toggle source
# File lib/unicorn/soft_timeout.rb, line 5
def self.new(app, soft_timeout = 12)
  ObjectSpace.each_object(Unicorn::HttpServer) do |s|
    s.extend(self)
    s.instance_variable_set(:@_soft_timeout, soft_timeout)
  end
  app # pretend to be Rack middleware since it was in the past
end

Public Instance Methods

process_client(client) click to toggle source
Calls superclass method
# File lib/unicorn/soft_timeout.rb, line 13
def process_client(client)
  worker_pid = Process.pid
  current_thread = Thread.current

  watcher = Thread.new do
    sleep(@_soft_timeout)
    logger.warn "#{self}: worker (pid: #{worker_pid}) exceeds soft timeout (limit: #{@_soft_timeout})"
    Process.kill :QUIT, worker_pid # graceful shutdown
    current_thread.raise Timeout::Error.new('Soft timeout exceeded')
  end

  super(client) # Unicorn::HttpServer#process_client
  watcher.terminate
end