1
0
Fork 0
mirror of https://github.com/puma/puma.git synced 2022-11-09 13:48:40 -05:00

Move TTOU processing (#1165)

* Extract magic number into constant

* Skip processing if no workers are to be spawned

* Move culling of workers due to TTOU from sig handler to check_workers

* Change debug log invokations to debug
This commit is contained in:
Sven Riedel 2016-12-21 20:48:39 +01:00 committed by Nate Berkopec
parent 0b62a3970c
commit ba7fa8a94f

View file

@ -6,6 +6,8 @@ require 'time'
module Puma module Puma
class Cluster < Runner class Cluster < Runner
WORKER_CHECK_INTERVAL = 5
def initialize(cli, events) def initialize(cli, events)
super cli, events super cli, events
@ -113,6 +115,7 @@ module Puma
def spawn_workers def spawn_workers
diff = @options[:workers] - @workers.size diff = @options[:workers] - @workers.size
return if diff < 1
master = Process.pid master = Process.pid
@ -138,6 +141,21 @@ module Puma
end end
end end
def cull_workers
diff = @workers.size - @options[:workers]
return if diff < 1
debug "Culling #{diff.inspect} workers"
workers_to_cull = @workers[-diff,diff]
debug "Workers to cull: #{workers_to_cull.inspect}"
workers_to_cull.each do |worker|
log "- Worker #{worker.index} (pid: #{worker.pid}) terminating"
worker.term
end
end
def next_worker_index def next_worker_index
all_positions = 0...@options[:workers] all_positions = 0...@options[:workers]
occupied_positions = @workers.map { |w| w.index } occupied_positions = @workers.map { |w| w.index }
@ -152,7 +170,7 @@ module Puma
def check_workers(force=false) def check_workers(force=false)
return if !force && @next_check && @next_check >= Time.now return if !force && @next_check && @next_check >= Time.now
@next_check = Time.now + 5 @next_check = Time.now + WORKER_CHECK_INTERVAL
any = false any = false
@ -178,6 +196,7 @@ module Puma
@workers.delete_if(&:dead?) @workers.delete_if(&:dead?)
cull_workers
spawn_workers spawn_workers
if all_workers_booted? if all_workers_booted?
@ -256,7 +275,7 @@ module Puma
base_payload = "p#{Process.pid}" base_payload = "p#{Process.pid}"
while true while true
sleep 5 sleep WORKER_CHECK_INTERVAL
begin begin
b = server.backlog b = server.backlog
r = server.running r = server.running
@ -340,7 +359,6 @@ module Puma
Signal.trap "TTOU" do Signal.trap "TTOU" do
@options[:workers] -= 1 if @options[:workers] >= 2 @options[:workers] -= 1 if @options[:workers] >= 2
@workers.last.term
wakeup! wakeup!
end end
@ -448,7 +466,7 @@ module Puma
force_check = false force_check = false
res = IO.select([read], nil, nil, 5) res = IO.select([read], nil, nil, WORKER_CHECK_INTERVAL)
if res if res
req = read.read_nonblock(1) req = read.read_nonblock(1)