delayed_job_master 2.0.2 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +32 -21
- data/.gitignore +0 -2
- data/CHANGELOG.md +17 -0
- data/README.md +46 -33
- data/delayed_job_master.gemspec +8 -5
- data/gemfiles/rails60.gemfile +1 -0
- data/gemfiles/rails70.gemfile +5 -0
- data/lib/delayed/master/callbacks.rb +37 -0
- data/lib/delayed/master/command.rb +28 -5
- data/lib/delayed/master/config.rb +51 -58
- data/lib/delayed/master/core.rb +146 -0
- data/lib/delayed/master/database.rb +72 -0
- data/lib/delayed/master/file_reopener.rb +18 -0
- data/lib/delayed/master/forker.rb +30 -19
- data/lib/delayed/master/job_checker.rb +89 -58
- data/lib/delayed/master/job_finder.rb +31 -0
- data/lib/delayed/master/job_listener.rb +31 -0
- data/lib/delayed/master/monitoring.rb +37 -36
- data/lib/delayed/master/postgresql/job_listener.rb +73 -0
- data/lib/delayed/master/postgresql/job_notifier.rb +45 -0
- data/lib/delayed/master/safe_array.rb +30 -0
- data/lib/delayed/master/signaler.rb +17 -7
- data/lib/delayed/master/sleep.rb +18 -0
- data/lib/delayed/master/worker/backend/active_record.rb +41 -0
- data/lib/delayed/master/worker/extension.rb +14 -0
- data/lib/delayed/master/worker/lifecycle.rb +10 -0
- data/lib/delayed/master/worker/plugins/all.rb +17 -0
- data/lib/delayed/master/worker/plugins/executor_wrapper.rb +23 -0
- data/lib/delayed/master/worker/plugins/memory_checker.rb +28 -0
- data/lib/delayed/master/worker/plugins/signal_handler.rb +35 -0
- data/lib/delayed/master/worker/plugins/status_notifier.rb +21 -0
- data/lib/delayed/master/worker/thread_pool.rb +64 -0
- data/lib/delayed/master/worker/thread_worker.rb +65 -0
- data/lib/delayed/master/worker.rb +8 -7
- data/lib/delayed/master/worker_setting.rb +72 -0
- data/lib/delayed/master.rb +7 -100
- data/lib/delayed_job_master/railtie.rb +16 -0
- data/lib/delayed_job_master/version.rb +5 -0
- data/lib/delayed_job_master.rb +15 -1
- data/lib/generators/delayed_job_master/templates/config.rb +14 -14
- data/lib/generators/delayed_job_master/templates/script +1 -1
- metadata +73 -17
- data/gemfiles/rails50.gemfile +0 -7
- data/gemfiles/rails51.gemfile +0 -7
- data/gemfiles/rails52.gemfile +0 -7
- data/lib/delayed/master/job_counter.rb +0 -26
- data/lib/delayed/master/plugins/memory_checker.rb +0 -24
- data/lib/delayed/master/plugins/signal_handler.rb +0 -31
- data/lib/delayed/master/plugins/status_notifier.rb +0 -17
- data/lib/delayed/master/util/file_reopener.rb +0 -18
- data/lib/delayed/master/version.rb +0 -5
- data/lib/delayed/master/worker_extension.rb +0 -19
data/lib/delayed/master.rb
CHANGED
|
@@ -1,105 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
require 'logger'
|
|
3
|
-
require_relative 'master/version'
|
|
4
|
-
require_relative 'master/command'
|
|
5
|
-
require_relative 'master/worker'
|
|
6
|
-
require_relative 'master/monitoring'
|
|
7
|
-
require_relative 'master/signaler'
|
|
8
|
-
require_relative 'master/util/file_reopener'
|
|
1
|
+
# frozen_string_literal: true
|
|
9
2
|
|
|
10
|
-
|
|
11
|
-
class Master
|
|
12
|
-
attr_reader :config, :logger, :workers
|
|
13
|
-
|
|
14
|
-
def initialize(argv)
|
|
15
|
-
@config = Command.new(argv).config
|
|
16
|
-
@logger = setup_logger(@config.log_file, @config.log_level)
|
|
17
|
-
@workers = []
|
|
18
|
-
|
|
19
|
-
@signaler = Signaler.new(self)
|
|
20
|
-
@monitoring = Monitoring.new(self)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def run
|
|
24
|
-
print_config
|
|
25
|
-
daemonize if @config.daemon
|
|
3
|
+
require_relative 'master/core'
|
|
26
4
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
@monitoring.monitor_while { stop? }
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
@logger.info "shut down master"
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def prepared?
|
|
39
|
-
@prepared
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def quit
|
|
43
|
-
@signaler.dispatch(:KILL)
|
|
44
|
-
@stop = true
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def stop
|
|
48
|
-
@signaler.dispatch(:TERM)
|
|
49
|
-
@stop = true
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def stop?
|
|
53
|
-
@stop == true
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def reopen_files
|
|
57
|
-
@signaler.dispatch(:USR1)
|
|
58
|
-
@logger.info "reopening files..."
|
|
59
|
-
Util::FileReopener.reopen
|
|
60
|
-
@logger.info "reopened"
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def restart
|
|
64
|
-
@signaler.dispatch(:USR2)
|
|
65
|
-
@logger.info "restarting master..."
|
|
66
|
-
exec(*([$0] + ARGV))
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
private
|
|
70
|
-
|
|
71
|
-
def setup_logger(log_file, log_level)
|
|
72
|
-
FileUtils.mkdir_p(File.dirname(log_file)) if log_file.is_a?(String)
|
|
73
|
-
logger = Logger.new(log_file)
|
|
74
|
-
logger.level = log_level
|
|
75
|
-
logger
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
def daemonize
|
|
79
|
-
Process.daemon(true)
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
def handle_pid_file
|
|
83
|
-
create_pid_file
|
|
84
|
-
yield
|
|
85
|
-
remove_pid_file
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
def create_pid_file
|
|
89
|
-
FileUtils.mkdir_p(File.dirname(@config.pid_file))
|
|
90
|
-
File.write(@config.pid_file, Process.pid)
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
def remove_pid_file
|
|
94
|
-
File.delete(@config.pid_file) if File.exist?(@config.pid_file)
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
def print_config
|
|
98
|
-
@logger.info "databases: #{@config.databases.join(', ')}" if @config.databases
|
|
99
|
-
@config.worker_settings.each do |setting|
|
|
100
|
-
message = "worker[#{setting.id}]: #{setting.count} processes"
|
|
101
|
-
message << " (#{setting.queues.join(', ')})" if setting.queues.respond_to?(:join)
|
|
102
|
-
@logger.info message
|
|
5
|
+
module Delayed
|
|
6
|
+
module Master
|
|
7
|
+
class << self
|
|
8
|
+
def new(argv)
|
|
9
|
+
Core.new(argv)
|
|
103
10
|
end
|
|
104
11
|
end
|
|
105
12
|
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module DelayedJobMaster
|
|
2
|
+
class Railtie < Rails::Railtie
|
|
3
|
+
config.after_initialize do
|
|
4
|
+
case DelayedJobMaster.config.listener
|
|
5
|
+
when :postgresql
|
|
6
|
+
require_relative '../delayed/master/postgresql/job_notifier'
|
|
7
|
+
if defined?(Delayed::Backend::ActiveRecord)
|
|
8
|
+
Delayed::Backend::ActiveRecord::Job.include Delayed::Master::Postgresql::JobNotifier
|
|
9
|
+
end
|
|
10
|
+
if defined?(Delayed::Backend::Bulk)
|
|
11
|
+
Delayed::Backend::Bulk.include Delayed::Master::Postgresql::BulkJobNotifier
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
data/lib/delayed_job_master.rb
CHANGED
|
@@ -1 +1,15 @@
|
|
|
1
|
-
require '
|
|
1
|
+
require 'active_support'
|
|
2
|
+
|
|
3
|
+
require_relative 'delayed_job_master/version'
|
|
4
|
+
require_relative 'delayed_job_master/railtie' if defined?(Rails)
|
|
5
|
+
|
|
6
|
+
module DelayedJobMaster
|
|
7
|
+
mattr_accessor :config, default: ActiveSupport::InheritableOptions.new
|
|
8
|
+
config.listener = :postgresql if defined?(PG)
|
|
9
|
+
|
|
10
|
+
class << self
|
|
11
|
+
def configure
|
|
12
|
+
yield config
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
# working directory
|
|
2
2
|
working_directory Dir.pwd
|
|
3
3
|
|
|
4
|
-
# monitor
|
|
5
|
-
|
|
4
|
+
# monitor interval for events (in seconds)
|
|
5
|
+
monitor_interval 5
|
|
6
|
+
|
|
7
|
+
# polling interval for new jobs (in seconds)
|
|
8
|
+
polling_interval 5
|
|
6
9
|
|
|
7
10
|
# path to pid file
|
|
8
11
|
pid_file "#{Dir.pwd}/tmp/pids/delayed_job_master.pid"
|
|
@@ -18,9 +21,12 @@ add_worker do |worker|
|
|
|
18
21
|
# queue name for the worker
|
|
19
22
|
worker.queues %w(queue1)
|
|
20
23
|
|
|
21
|
-
#
|
|
22
|
-
worker.
|
|
24
|
+
# max process count
|
|
25
|
+
worker.max_processes 1
|
|
23
26
|
|
|
27
|
+
# max thread count for each worker
|
|
28
|
+
worker.max_threads 1
|
|
29
|
+
|
|
24
30
|
# max memory in MB
|
|
25
31
|
worker.max_memory 300
|
|
26
32
|
|
|
@@ -37,20 +43,14 @@ end
|
|
|
37
43
|
# worker2
|
|
38
44
|
add_worker do |worker|
|
|
39
45
|
worker.queues %w(queue2)
|
|
40
|
-
worker.
|
|
46
|
+
worker.max_processes 2
|
|
47
|
+
worker.max_threads 2
|
|
41
48
|
end
|
|
42
49
|
|
|
43
50
|
before_fork do |master, worker|
|
|
44
|
-
|
|
51
|
+
ActiveRecord::Base.connection.disconnect!
|
|
45
52
|
end
|
|
46
53
|
|
|
47
54
|
after_fork do |master, worker|
|
|
48
|
-
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
before_monitor do |master|
|
|
52
|
-
ActiveRecord::Base.connection.verify! if defined?(ActiveRecord::Base)
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
after_monitor do |master|
|
|
55
|
+
ActiveRecord::Base.establish_connection
|
|
56
56
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: delayed_job_master
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 3.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Yoshikazu Kaneta
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2023-05-18 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: delayed_job
|
|
@@ -38,20 +38,34 @@ dependencies:
|
|
|
38
38
|
- - ">="
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
40
|
version: '0'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: activesupport
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - ">="
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '6.0'
|
|
48
|
+
type: :runtime
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - ">="
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '6.0'
|
|
41
55
|
- !ruby/object:Gem::Dependency
|
|
42
56
|
name: rails
|
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
|
44
58
|
requirements:
|
|
45
59
|
- - ">="
|
|
46
60
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: '0'
|
|
61
|
+
version: '6.0'
|
|
48
62
|
type: :development
|
|
49
63
|
prerelease: false
|
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
65
|
requirements:
|
|
52
66
|
- - ">="
|
|
53
67
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: '0'
|
|
68
|
+
version: '6.0'
|
|
55
69
|
- !ruby/object:Gem::Dependency
|
|
56
70
|
name: rake
|
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -95,7 +109,21 @@ dependencies:
|
|
|
95
109
|
- !ruby/object:Gem::Version
|
|
96
110
|
version: '0'
|
|
97
111
|
- !ruby/object:Gem::Dependency
|
|
98
|
-
name:
|
|
112
|
+
name: pg
|
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
|
114
|
+
requirements:
|
|
115
|
+
- - ">="
|
|
116
|
+
- !ruby/object:Gem::Version
|
|
117
|
+
version: '0'
|
|
118
|
+
type: :development
|
|
119
|
+
prerelease: false
|
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
+
requirements:
|
|
122
|
+
- - ">="
|
|
123
|
+
- !ruby/object:Gem::Version
|
|
124
|
+
version: '0'
|
|
125
|
+
- !ruby/object:Gem::Dependency
|
|
126
|
+
name: mysql2
|
|
99
127
|
requirement: !ruby/object:Gem::Requirement
|
|
100
128
|
requirements:
|
|
101
129
|
- - ">="
|
|
@@ -122,6 +150,20 @@ dependencies:
|
|
|
122
150
|
- - ">="
|
|
123
151
|
- !ruby/object:Gem::Version
|
|
124
152
|
version: '4.1'
|
|
153
|
+
- !ruby/object:Gem::Dependency
|
|
154
|
+
name: delayed_job_bulk
|
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
|
156
|
+
requirements:
|
|
157
|
+
- - ">="
|
|
158
|
+
- !ruby/object:Gem::Version
|
|
159
|
+
version: 1.0.0
|
|
160
|
+
type: :development
|
|
161
|
+
prerelease: false
|
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
163
|
+
requirements:
|
|
164
|
+
- - ">="
|
|
165
|
+
- !ruby/object:Gem::Version
|
|
166
|
+
version: 1.0.0
|
|
125
167
|
description: A simple delayed_job master process to control multiple workers
|
|
126
168
|
email:
|
|
127
169
|
- kaneta@sitebridge.co.jp
|
|
@@ -139,27 +181,41 @@ files:
|
|
|
139
181
|
- README.md
|
|
140
182
|
- Rakefile
|
|
141
183
|
- delayed_job_master.gemspec
|
|
142
|
-
- gemfiles/rails50.gemfile
|
|
143
|
-
- gemfiles/rails51.gemfile
|
|
144
|
-
- gemfiles/rails52.gemfile
|
|
145
184
|
- gemfiles/rails60.gemfile
|
|
146
185
|
- gemfiles/rails61.gemfile
|
|
186
|
+
- gemfiles/rails70.gemfile
|
|
147
187
|
- lib/delayed/master.rb
|
|
188
|
+
- lib/delayed/master/callbacks.rb
|
|
148
189
|
- lib/delayed/master/command.rb
|
|
149
190
|
- lib/delayed/master/config.rb
|
|
191
|
+
- lib/delayed/master/core.rb
|
|
192
|
+
- lib/delayed/master/database.rb
|
|
193
|
+
- lib/delayed/master/file_reopener.rb
|
|
150
194
|
- lib/delayed/master/forker.rb
|
|
151
195
|
- lib/delayed/master/job_checker.rb
|
|
152
|
-
- lib/delayed/master/
|
|
196
|
+
- lib/delayed/master/job_finder.rb
|
|
197
|
+
- lib/delayed/master/job_listener.rb
|
|
153
198
|
- lib/delayed/master/monitoring.rb
|
|
154
|
-
- lib/delayed/master/
|
|
155
|
-
- lib/delayed/master/
|
|
156
|
-
- lib/delayed/master/
|
|
199
|
+
- lib/delayed/master/postgresql/job_listener.rb
|
|
200
|
+
- lib/delayed/master/postgresql/job_notifier.rb
|
|
201
|
+
- lib/delayed/master/safe_array.rb
|
|
157
202
|
- lib/delayed/master/signaler.rb
|
|
158
|
-
- lib/delayed/master/
|
|
159
|
-
- lib/delayed/master/version.rb
|
|
203
|
+
- lib/delayed/master/sleep.rb
|
|
160
204
|
- lib/delayed/master/worker.rb
|
|
161
|
-
- lib/delayed/master/
|
|
205
|
+
- lib/delayed/master/worker/backend/active_record.rb
|
|
206
|
+
- lib/delayed/master/worker/extension.rb
|
|
207
|
+
- lib/delayed/master/worker/lifecycle.rb
|
|
208
|
+
- lib/delayed/master/worker/plugins/all.rb
|
|
209
|
+
- lib/delayed/master/worker/plugins/executor_wrapper.rb
|
|
210
|
+
- lib/delayed/master/worker/plugins/memory_checker.rb
|
|
211
|
+
- lib/delayed/master/worker/plugins/signal_handler.rb
|
|
212
|
+
- lib/delayed/master/worker/plugins/status_notifier.rb
|
|
213
|
+
- lib/delayed/master/worker/thread_pool.rb
|
|
214
|
+
- lib/delayed/master/worker/thread_worker.rb
|
|
215
|
+
- lib/delayed/master/worker_setting.rb
|
|
162
216
|
- lib/delayed_job_master.rb
|
|
217
|
+
- lib/delayed_job_master/railtie.rb
|
|
218
|
+
- lib/delayed_job_master/version.rb
|
|
163
219
|
- lib/generators/delayed_job_master/config_generator.rb
|
|
164
220
|
- lib/generators/delayed_job_master/templates/config.rb
|
|
165
221
|
- lib/generators/delayed_job_master/templates/script
|
|
@@ -175,14 +231,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
175
231
|
requirements:
|
|
176
232
|
- - ">="
|
|
177
233
|
- !ruby/object:Gem::Version
|
|
178
|
-
version: '2.
|
|
234
|
+
version: '2.7'
|
|
179
235
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
180
236
|
requirements:
|
|
181
237
|
- - ">="
|
|
182
238
|
- !ruby/object:Gem::Version
|
|
183
239
|
version: '0'
|
|
184
240
|
requirements: []
|
|
185
|
-
rubygems_version: 3.
|
|
241
|
+
rubygems_version: 3.3.3
|
|
186
242
|
signing_key:
|
|
187
243
|
specification_version: 4
|
|
188
244
|
summary: A simple delayed_job master process to control multiple workers
|
data/gemfiles/rails50.gemfile
DELETED
data/gemfiles/rails51.gemfile
DELETED
data/gemfiles/rails52.gemfile
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
# JobCounter depends on delayed_job_active_record.
|
|
2
|
-
# See https://github.com/collectiveidea/delayed_job_active_record/blob/master/lib/delayed/backend/active_record.rb
|
|
3
|
-
module Delayed
|
|
4
|
-
class Master
|
|
5
|
-
class JobCounter
|
|
6
|
-
def initialize(klass)
|
|
7
|
-
@klass = klass
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def count(setting)
|
|
11
|
-
jobs = ready_to_run(setting.max_run_time || Delayed::Worker::DEFAULT_MAX_RUN_TIME)
|
|
12
|
-
jobs.where!("priority >= ?", setting.min_priority) if setting.min_priority
|
|
13
|
-
jobs.where!("priority <= ?", setting.max_priority) if setting.max_priority
|
|
14
|
-
jobs.where!(queue: setting.queues) if setting.queues.any?
|
|
15
|
-
jobs.count
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
private
|
|
19
|
-
|
|
20
|
-
def ready_to_run(max_run_time)
|
|
21
|
-
db_time_now = @klass.db_time_now
|
|
22
|
-
@klass.where("(run_at <= ? AND (locked_at IS NULL OR locked_at < ?)) AND failed_at IS NULL", db_time_now, db_time_now - max_run_time)
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
require 'get_process_mem'
|
|
2
|
-
|
|
3
|
-
module Delayed
|
|
4
|
-
class Master
|
|
5
|
-
module Plugins
|
|
6
|
-
class MemoryChecker < Delayed::Plugin
|
|
7
|
-
callbacks do |lifecycle|
|
|
8
|
-
lifecycle.before(:perform) do |worker, job|
|
|
9
|
-
mem = GetProcessMem.new
|
|
10
|
-
worker.master_logger.info "performing #{job.name}, memory: #{mem.mb.to_i} MB"
|
|
11
|
-
end
|
|
12
|
-
lifecycle.after(:perform) do |worker, job|
|
|
13
|
-
mem = GetProcessMem.new
|
|
14
|
-
worker.master_logger.info "performed #{job.name}, memory: #{mem.mb.to_i} MB"
|
|
15
|
-
if worker.max_memory && mem.mb > worker.max_memory
|
|
16
|
-
worker.master_logger.info "shutting down worker #{Process.pid} because it consumes large memory..."
|
|
17
|
-
worker.stop
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
module Delayed
|
|
2
|
-
class Master
|
|
3
|
-
module Plugins
|
|
4
|
-
class SignalHandler < Delayed::Plugin
|
|
5
|
-
callbacks do |lifecycle|
|
|
6
|
-
lifecycle.before(:execute) do |worker|
|
|
7
|
-
worker.instance_eval do
|
|
8
|
-
trap(:USR1) do
|
|
9
|
-
Thread.new do
|
|
10
|
-
master_logger.info "reopening files..."
|
|
11
|
-
Delayed::Master::Util::FileReopener.reopen
|
|
12
|
-
master_logger.info "reopened"
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
trap(:USR2) do
|
|
16
|
-
Thread.new do
|
|
17
|
-
$0 = "#{$0} [OLD]"
|
|
18
|
-
master_logger.info "shutting down worker #{Process.pid}..."
|
|
19
|
-
stop
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
lifecycle.after(:execute) do |worker|
|
|
25
|
-
worker.master_logger.info "shut down worker #{Process.pid}"
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
end
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
module Delayed
|
|
2
|
-
class Master
|
|
3
|
-
module Plugins
|
|
4
|
-
class StatusNotifier < Delayed::Plugin
|
|
5
|
-
callbacks do |lifecycle|
|
|
6
|
-
lifecycle.around(:perform) do |worker, job, &block|
|
|
7
|
-
title = $0
|
|
8
|
-
$0 = "#{title} [BUSY]"
|
|
9
|
-
ret = block.call
|
|
10
|
-
$0 = title
|
|
11
|
-
ret
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
module Delayed
|
|
2
|
-
class Master
|
|
3
|
-
class Util
|
|
4
|
-
class FileReopener
|
|
5
|
-
class << self
|
|
6
|
-
def reopen
|
|
7
|
-
ObjectSpace.each_object(File) do |file|
|
|
8
|
-
next if file.closed? || !file.sync
|
|
9
|
-
file.reopen file.path, 'a+'
|
|
10
|
-
file.sync = true
|
|
11
|
-
file.flush
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
module Delayed
|
|
2
|
-
class Worker
|
|
3
|
-
attr_accessor :master_logger, :max_memory
|
|
4
|
-
end
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
require_relative 'plugins/memory_checker'
|
|
8
|
-
require_relative 'plugins/signal_handler'
|
|
9
|
-
require_relative 'plugins/status_notifier'
|
|
10
|
-
|
|
11
|
-
[
|
|
12
|
-
Delayed::Master::Plugins::MemoryChecker,
|
|
13
|
-
Delayed::Master::Plugins::SignalHandler,
|
|
14
|
-
Delayed::Master::Plugins::StatusNotifier
|
|
15
|
-
].each do |plugin|
|
|
16
|
-
unless Delayed::Worker.plugins.include?(plugin)
|
|
17
|
-
Delayed::Worker.plugins << plugin
|
|
18
|
-
end
|
|
19
|
-
end
|