Class: Puma::Cluster::WorkerHandle

Inherits:
Object
  • Object
show all
Defined in:
lib/puma/cluster/worker_handle.rb

Overview

This class represents a worker process from the perspective of the puma master process. It contains information about the process and its health and it exposes methods to control the process via IPC. It does not include the actual logic executed by the worker process itself. For that, see Puma::Cluster::Worker.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(idx, pid, phase, options) ⇒ WorkerHandle

:nodoc:



14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/puma/cluster/worker_handle.rb', line 14

def initialize(idx, pid, phase, options)
  @index = idx
  @pid = pid
  @phase = phase
  @stage = :started
  @signal = "TERM"
  @options = options
  @first_term_sent = nil
  @started_at = Time.now
  @last_checkin = Time.now
  @last_status = {}
  @term = false
end

Instance Attribute Details

#indexObject (readonly)

Returns the value of attribute index.



28
29
30
# File 'lib/puma/cluster/worker_handle.rb', line 28

def index
  @index
end

#last_checkinObject (readonly)

Returns the value of attribute last_checkin.



28
29
30
# File 'lib/puma/cluster/worker_handle.rb', line 28

def last_checkin
  @last_checkin
end

#last_statusObject (readonly)

Returns the value of attribute last_status.



28
29
30
# File 'lib/puma/cluster/worker_handle.rb', line 28

def last_status
  @last_status
end

#phaseObject

Returns the value of attribute phase.



28
29
30
# File 'lib/puma/cluster/worker_handle.rb', line 28

def phase
  @phase
end

#pidObject

Returns the value of attribute pid.



28
29
30
# File 'lib/puma/cluster/worker_handle.rb', line 28

def pid
  @pid
end

#signalObject (readonly)

Returns the value of attribute signal.



28
29
30
# File 'lib/puma/cluster/worker_handle.rb', line 28

def signal
  @signal
end

#started_atObject (readonly)

Returns the value of attribute started_at.



28
29
30
# File 'lib/puma/cluster/worker_handle.rb', line 28

def started_at
  @started_at
end

Instance Method Details

#boot!Object



41
42
43
44
# File 'lib/puma/cluster/worker_handle.rb', line 41

def boot!
  @last_checkin = Time.now
  @stage = :booted
end

#booted?Boolean

Returns:

  • (Boolean)


33
34
35
# File 'lib/puma/cluster/worker_handle.rb', line 33

def booted?
  @stage == :booted
end

#hupObject



91
92
93
94
# File 'lib/puma/cluster/worker_handle.rb', line 91

def hup
  Process.kill "HUP", @pid
rescue Errno::ESRCH
end

#killObject



86
87
88
89
# File 'lib/puma/cluster/worker_handle.rb', line 86

def kill
  @signal = 'KILL'
  term
end

#ping!(status) ⇒ Object



54
55
56
57
58
59
60
61
# File 'lib/puma/cluster/worker_handle.rb', line 54

def ping!(status)
  @last_checkin = Time.now
  captures = status.match(/{ "backlog":(?<backlog>\d*), "running":(?<running>\d*), "pool_capacity":(?<pool_capacity>\d*), "max_threads": (?<max_threads>\d*), "requests_count": (?<requests_count>\d*) }/)
  @last_status = captures.names.inject({}) do |hash, key|
    hash[key.to_sym] = captures[key].to_i
    hash
  end
end

#ping_timeoutObject

See Also:

Version:

  • 5.0.0



65
66
67
68
69
70
71
# File 'lib/puma/cluster/worker_handle.rb', line 65

def ping_timeout
  @last_checkin +
    (booted? ?
      @options[:worker_timeout] :
      @options[:worker_boot_timeout]
    )
end

#termObject



73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/puma/cluster/worker_handle.rb', line 73

def term
  begin
    if @first_term_sent && (Time.now - @first_term_sent) > @options[:worker_shutdown_timeout]
      @signal = "KILL"
    else
      @term ||= true
      @first_term_sent ||= Time.now
    end
    Process.kill @signal, @pid if @pid
  rescue Errno::ESRCH
  end
end

#term!Object



46
47
48
# File 'lib/puma/cluster/worker_handle.rb', line 46

def term!
  @term = true
end

#term?Boolean

Returns:

  • (Boolean)


50
51
52
# File 'lib/puma/cluster/worker_handle.rb', line 50

def term?
  @term
end

#uptimeObject



37
38
39
# File 'lib/puma/cluster/worker_handle.rb', line 37

def uptime
  Time.now - started_at
end