Class: WorkerKiller::PumaPluginNg
- Inherits:
-
Object
- Object
- WorkerKiller::PumaPluginNg
- Includes:
- Singleton
- Defined in:
- lib/worker_killer/puma_plugin_ng.rb
Defined Under Namespace
Classes: PumaLogWrapper
Instance Attribute Summary collapse
-
#kill_queue ⇒ Object
Returns the value of attribute kill_queue.
-
#killer ⇒ Object
Returns the value of attribute killer.
-
#puma_server ⇒ Object
Returns the value of attribute puma_server.
Instance Method Summary collapse
-
#config(dsl) ⇒ Object
Этот метод зовётся при ИНИЦИАЛИЗАЦИИ плагина внути master-процесса, в самомо начале тут можно выполнить конфигурацию чегоднибудь нужного.
- #debug(msg) ⇒ Object
- #do_kill(name) ⇒ Object
-
#force_restart!(force = true) ⇒ Object
Завершать процесс сразу после окончания inhibited метода.
-
#initialize ⇒ PumaPluginNg
constructor
A new instance of PumaPluginNg.
- #log(msg) ⇒ Object
-
#request_restart_server(worker_num) ⇒ Object
Этот метод зовётся из Middleware внтури воркера.
- #set_logger!(logger) ⇒ Object
-
#start(launcher) ⇒ Object
Этот метод зовётся при ИНИЦИАЛИЗАЦИИ плагина внути master-процесса, контролирующего кластер Puma псле форка данные сохранённые тут также доступны (например logger).
- #tag ⇒ Object
Constructor Details
#initialize ⇒ PumaPluginNg
Returns a new instance of PumaPluginNg.
27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/worker_killer/puma_plugin_ng.rb', line 27 def initialize @killer = ::WorkerKiller::Killer::Puma.new(worker_num: nil, puma_plugin: self) @worker_num = nil @debug = false @puma_server = nil @force_restart = %w[t 1].include?(ENV.fetch('WORKER_KILLER_PUMA_AGGRESSIVE', 'false').to_s.downcase[0].to_s) @kill_queue ||= Set.new @last_restarted_at = 0.0 end |
Instance Attribute Details
#kill_queue ⇒ Object
Returns the value of attribute kill_queue.
25 26 27 |
# File 'lib/worker_killer/puma_plugin_ng.rb', line 25 def kill_queue @kill_queue end |
#killer ⇒ Object
Returns the value of attribute killer.
25 26 27 |
# File 'lib/worker_killer/puma_plugin_ng.rb', line 25 def killer @killer end |
#puma_server ⇒ Object
Returns the value of attribute puma_server.
25 26 27 |
# File 'lib/worker_killer/puma_plugin_ng.rb', line 25 def puma_server @puma_server end |
Instance Method Details
#config(dsl) ⇒ Object
Этот метод зовётся при ИНИЦИАЛИЗАЦИИ плагина внути master-процесса, в самомо начале тут можно выполнить конфигурацию чегоднибудь нужного
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/worker_killer/puma_plugin_ng.rb', line 41 def config(dsl) if %w[t 1].include?(ENV.fetch('WORKER_KILLER_DEBUG', 'false').to_s.downcase[0].to_s) @debug = true end cb = if dsl.respond_to?(:before_worker_boot) :before_worker_boot else # DEPRECATED :on_worker_boot end dsl.send(cb) do |num| @killer.worker_num = num @worker_num = num @tag = nil log "Set worker_num: #{num}" end dsl.out_of_band do do_kill('OOB') unless @force_restart end end |
#debug(msg) ⇒ Object
116 117 118 119 120 121 122 123 124 |
# File 'lib/worker_killer/puma_plugin_ng.rb', line 116 def debug(msg) return unless @debug if @logger @logger.warn("#{tag} (DEBUG) #{msg}") else warn("[#{Process.pid}] #{tag} (DEBUG) #{msg}") end end |
#do_kill(name) ⇒ Object
89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/worker_killer/puma_plugin_ng.rb', line 89 def do_kill(name) return if kill_queue.empty? now = Process.clock_gettime(Process::CLOCK_MONOTONIC) return if now - @last_restarted_at < 10 @last_restarted_at = now log "Killing workers by #{name}: #{kill_queue}" kill_queue.each do |worker_num| kill_queue.delete(worker_num) Thread.current.puma_server.[:force_shutdown_after] = nil Thread.current.puma_server.begin_restart end end |
#force_restart!(force = true) ⇒ Object
Завершать процесс сразу после окончания inhibited метода. Иначе завершение будет происзодть в Out Of Band методе
76 77 78 |
# File 'lib/worker_killer/puma_plugin_ng.rb', line 76 def force_restart!(force = true) @force_restart = force end |
#log(msg) ⇒ Object
104 105 106 107 108 109 110 |
# File 'lib/worker_killer/puma_plugin_ng.rb', line 104 def log(msg) if @logger @logger.warn("#{tag} #{msg}") else warn("[#{Process.pid}] #{tag} #{msg}") end end |
#request_restart_server(worker_num) ⇒ Object
Этот метод зовётся из Middleware внтури воркера
81 82 83 84 85 86 87 |
# File 'lib/worker_killer/puma_plugin_ng.rb', line 81 def request_restart_server(worker_num) return if @worker_num != worker_num log("Enqueue worker #{worker_num} for restarting...") kill_queue << worker_num do_kill('FORCE') if @force_restart end |
#set_logger!(logger) ⇒ Object
71 72 73 |
# File 'lib/worker_killer/puma_plugin_ng.rb', line 71 def set_logger!(logger) @logger = logger end |
#start(launcher) ⇒ Object
Этот метод зовётся при ИНИЦИАЛИЗАЦИИ плагина внути master-процесса, контролирующего кластер Puma псле форка данные сохранённые тут также доступны (например logger)
67 68 69 |
# File 'lib/worker_killer/puma_plugin_ng.rb', line 67 def start(launcher) set_logger!(PumaLogWrapper.new(launcher.log_writer)) end |
#tag ⇒ Object
112 113 114 |
# File 'lib/worker_killer/puma_plugin_ng.rb', line 112 def tag @tag ||= "[#{self.class}] #{@worker_num.nil? ? '[M]' : "[W#{@worker_num}]"} #{@force_restart ? '(Force)' : ''}" end |