Module: Unicorn::SoftTimeout

Defined in:
lib/unicorn/soft_timeout.rb,
lib/unicorn/soft_timeout/version.rb

Constant Summary collapse

VERSION =
"0.0.1"

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.new(app, soft_timeout = 12) ⇒ Object



5
6
7
8
9
10
11
# 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

Instance Method Details

#process_client(client) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 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