delayed_job_master 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.travis.yml +2 -2
- data/CHANGELOG.md +16 -0
- data/Gemfile +0 -1
- data/README.md +3 -2
- data/gemfiles/active_record.gemfile +2 -0
- data/gemfiles/mongoid.gemfile +2 -0
- data/lib/delayed/master.rb +11 -13
- data/lib/delayed/master/callback.rb +3 -3
- data/lib/delayed/master/command.rb +4 -4
- data/lib/delayed/master/config.rb +84 -0
- data/lib/delayed/master/job_counter/active_record.rb +5 -5
- data/lib/delayed/master/job_counter/mongoid.rb +5 -5
- data/lib/delayed/master/signal_handler.rb +4 -4
- data/lib/delayed/master/util/file_reopener.rb +18 -0
- data/lib/delayed/master/version.rb +1 -1
- data/lib/delayed/master/worker.rb +19 -0
- data/lib/delayed/master/worker_pool.rb +56 -53
- data/lib/delayed/worker/plugins/signal_handler.rb +1 -1
- data/lib/generators/delayed_job_master/templates/config.rb +3 -2
- metadata +7 -7
- data/lib/delayed/master/dsl.rb +0 -60
- data/lib/delayed/master/worker_info.rb +0 -19
- data/lib/delayed/util/file_reopener.rb +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 548efefc42b3ecd02bcb85da66da4a8e001376057a54ee7a636adf5177346923
|
4
|
+
data.tar.gz: 6c83c6a641d334f262bb191f68649c90cfa083ede76ace8e960c9b7a1ce99b9d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 81b40df17053df90e59c84c3e53bbc854ba0e623cc8185811725673867532f68525a65a86d732914f117f56788ebee607466d469e546f3be4332e2935ff17b60
|
7
|
+
data.tar.gz: c77e25e5aa04b6f4c11c3e7c630c3c8dcd45f691c5088cac3a8f07bb6980317419c1b5a45149c2154c4982991593f67f06bebef32dc27915e4d4958a05590981
|
data/.travis.yml
CHANGED
@@ -4,11 +4,11 @@ services:
|
|
4
4
|
rvm:
|
5
5
|
- 2.3
|
6
6
|
- 2.4
|
7
|
+
- 2.5
|
8
|
+
- 2.6
|
7
9
|
gemfile:
|
8
10
|
- gemfiles/active_record.gemfile
|
9
11
|
- gemfiles/mongoid.gemfile
|
10
|
-
before_install:
|
11
|
-
- gem install bundler -v 1.15.3
|
12
12
|
before_script:
|
13
13
|
- cd spec/dummy
|
14
14
|
- bundle exec rake db:migrate RAILS_ENV=test
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# CHANGELOG
|
2
|
+
|
3
|
+
## 1.2.0
|
4
|
+
|
5
|
+
* Add destroy_failed_jobs for worker.
|
6
|
+
* Get pid and worker instance in after_fork callback.
|
7
|
+
* Change config class for convenience.
|
8
|
+
|
9
|
+
## 1.1.0
|
10
|
+
|
11
|
+
* Add monitor callback to verify database connection.
|
12
|
+
* Refactoring.
|
13
|
+
|
14
|
+
## 1.0.0
|
15
|
+
|
16
|
+
* First release.
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -80,6 +80,7 @@ add_worker do |worker|
|
|
80
80
|
# worker.max_run_time 4.hours
|
81
81
|
# worker.min_priority 1
|
82
82
|
# worker.max_priority 10
|
83
|
+
# worker.destroy_failed_jobs true
|
83
84
|
end
|
84
85
|
|
85
86
|
# worker2
|
@@ -89,11 +90,11 @@ add_worker do |worker|
|
|
89
90
|
worker.count 2
|
90
91
|
end
|
91
92
|
|
92
|
-
before_fork do |master,
|
93
|
+
before_fork do |master, worker|
|
93
94
|
Delayed::Worker.before_fork if defined?(Delayed::Worker)
|
94
95
|
end
|
95
96
|
|
96
|
-
after_fork do |master,
|
97
|
+
after_fork do |master, worker|
|
97
98
|
Delayed::Worker.after_fork if defined?(Delayed::Worker)
|
98
99
|
end
|
99
100
|
|
data/gemfiles/mongoid.gemfile
CHANGED
data/lib/delayed/master.rb
CHANGED
@@ -1,31 +1,29 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
require 'logger'
|
3
|
-
require 'ostruct'
|
4
|
-
require_relative 'util/file_reopener'
|
5
3
|
require_relative 'master/version'
|
6
4
|
require_relative 'master/command'
|
7
5
|
require_relative 'master/callback'
|
8
|
-
require_relative 'master/
|
6
|
+
require_relative 'master/worker'
|
9
7
|
require_relative 'master/worker_pool'
|
10
8
|
require_relative 'master/signal_handler'
|
9
|
+
require_relative 'master/util/file_reopener'
|
11
10
|
|
12
11
|
module Delayed
|
13
12
|
class Master
|
14
|
-
attr_reader :config, :logger, :
|
13
|
+
attr_reader :config, :logger, :workers
|
15
14
|
|
16
15
|
def initialize(argv)
|
17
|
-
config = Command.new(argv).config
|
18
|
-
@config = OpenStruct.new(config).freeze
|
16
|
+
@config = Command.new(argv).config
|
19
17
|
@logger = setup_logger(@config.log_file, @config.log_level)
|
20
|
-
@
|
18
|
+
@workers = []
|
21
19
|
|
22
20
|
@signal_handler = SignalHandler.new(self)
|
23
|
-
@worker_pool = WorkerPool.new(self, config)
|
21
|
+
@worker_pool = WorkerPool.new(self, @config)
|
24
22
|
end
|
25
23
|
|
26
24
|
def run
|
27
25
|
load_app
|
28
|
-
|
26
|
+
show_config
|
29
27
|
daemonize if @config.daemon
|
30
28
|
|
31
29
|
create_pid_file
|
@@ -66,7 +64,7 @@ module Delayed
|
|
66
64
|
def reopen_files
|
67
65
|
@signal_handler.dispatch('USR1')
|
68
66
|
@logger.info "reopening files..."
|
69
|
-
|
67
|
+
Util::FileReopener.reopen
|
70
68
|
@logger.info "reopened"
|
71
69
|
end
|
72
70
|
|
@@ -106,9 +104,9 @@ module Delayed
|
|
106
104
|
Process.daemon(true)
|
107
105
|
end
|
108
106
|
|
109
|
-
def
|
110
|
-
@config.
|
111
|
-
puts "#{
|
107
|
+
def show_config
|
108
|
+
@config.workers.each do |setting|
|
109
|
+
puts "#{setting.count} worker for '#{setting.queues.join(',')}' under #{setting.control} control"
|
112
110
|
end
|
113
111
|
end
|
114
112
|
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
module Delayed
|
2
2
|
class Master
|
3
3
|
class Callback
|
4
|
-
def initialize(config
|
5
|
-
@
|
4
|
+
def initialize(config)
|
5
|
+
@callbacks = config.callbacks
|
6
6
|
end
|
7
7
|
|
8
8
|
def run(name, *args)
|
9
|
-
@
|
9
|
+
@callbacks[name].call(*args) if @callbacks[name]
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'optparse'
|
2
|
-
require_relative '
|
2
|
+
require_relative 'config'
|
3
3
|
|
4
4
|
module Delayed
|
5
5
|
class Master
|
@@ -7,7 +7,7 @@ module Delayed
|
|
7
7
|
attr_reader :config
|
8
8
|
|
9
9
|
def initialize(args)
|
10
|
-
@config =
|
10
|
+
@config = Config.new
|
11
11
|
|
12
12
|
OptionParser.new { |opt|
|
13
13
|
opt.banner = <<-EOS
|
@@ -20,10 +20,10 @@ module Delayed
|
|
20
20
|
exit
|
21
21
|
end
|
22
22
|
opt.on('-D', '--daemon', 'Start master as a daemon') do |boolean|
|
23
|
-
@config
|
23
|
+
@config.daemon(boolean)
|
24
24
|
end
|
25
25
|
opt.on('-c', '--config=FILE', 'Specify config file') do |file|
|
26
|
-
@config.
|
26
|
+
@config.read(file)
|
27
27
|
end
|
28
28
|
}.parse(args)
|
29
29
|
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module Delayed
|
2
|
+
class Master
|
3
|
+
class Config
|
4
|
+
SIMPLE_CONFIGS = [:working_directory, :log_file, :log_level, :pid_file, :monitor_wait, :daemon]
|
5
|
+
CALLBACK_CONFIGS = [:before_fork, :after_fork, :before_monitor, :after_monitor]
|
6
|
+
|
7
|
+
attr_reader :data, :workers
|
8
|
+
|
9
|
+
def initialize(file = nil)
|
10
|
+
@data = {}
|
11
|
+
@workers = []
|
12
|
+
read(file) if file
|
13
|
+
end
|
14
|
+
|
15
|
+
def read(file)
|
16
|
+
instance_eval(File.read(file))
|
17
|
+
end
|
18
|
+
|
19
|
+
def add_worker
|
20
|
+
worker = WorkerSetting.new(control: :static, count: 1)
|
21
|
+
yield worker
|
22
|
+
worker.exit_on_complete(true) if worker.control == :dynamic
|
23
|
+
@workers << worker
|
24
|
+
end
|
25
|
+
|
26
|
+
def callbacks
|
27
|
+
@data.select { |k, _| CALLBACK_CONFIGS.include?(k) }
|
28
|
+
end
|
29
|
+
|
30
|
+
SIMPLE_CONFIGS.each do |key|
|
31
|
+
define_method(key) do |value = nil|
|
32
|
+
if value
|
33
|
+
@data[key] = value
|
34
|
+
else
|
35
|
+
@data[key]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
CALLBACK_CONFIGS.each do |key|
|
41
|
+
define_method(key) do |&block|
|
42
|
+
if block
|
43
|
+
@data[key] = block
|
44
|
+
else
|
45
|
+
@data[key]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class WorkerSetting
|
51
|
+
SIMPLE_CONFIGS = [:control, :count, :max_memory,
|
52
|
+
:min_priority, :max_priority, :sleep_delay, :read_ahead, :exit_on_complete,
|
53
|
+
:max_attempts, :max_run_time, :destroy_failed_jobs]
|
54
|
+
ARRAY_CONFIGS = [:queues]
|
55
|
+
|
56
|
+
attr_reader :data
|
57
|
+
|
58
|
+
def initialize(default = {})
|
59
|
+
@data = default
|
60
|
+
end
|
61
|
+
|
62
|
+
SIMPLE_CONFIGS.each do |key|
|
63
|
+
define_method(key) do |value = nil|
|
64
|
+
if value
|
65
|
+
@data[key] = value
|
66
|
+
else
|
67
|
+
@data[key]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
ARRAY_CONFIGS.each do |key|
|
73
|
+
define_method(key) do |value = nil|
|
74
|
+
if value
|
75
|
+
@data[key] = Array(value)
|
76
|
+
else
|
77
|
+
@data[key]
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -4,11 +4,11 @@ module Delayed
|
|
4
4
|
class Master
|
5
5
|
class JobCounter
|
6
6
|
class << self
|
7
|
-
def count(
|
8
|
-
jobs = ready_to_run(
|
9
|
-
jobs.where!("priority >= ?",
|
10
|
-
jobs.where!("priority <= ?",
|
11
|
-
jobs.where!(queue:
|
7
|
+
def count(setting)
|
8
|
+
jobs = ready_to_run(setting.max_run_time || Delayed::Worker::DEFAULT_MAX_RUN_TIME)
|
9
|
+
jobs.where!("priority >= ?", setting.min_priority) if setting.min_priority
|
10
|
+
jobs.where!("priority <= ?", setting.max_priority) if setting.max_priority
|
11
|
+
jobs.where!(queue: setting.queues) if setting.queues.any?
|
12
12
|
jobs.count
|
13
13
|
end
|
14
14
|
|
@@ -4,12 +4,12 @@ module Delayed
|
|
4
4
|
class Master
|
5
5
|
class JobCounter
|
6
6
|
class << self
|
7
|
-
def count(
|
7
|
+
def count(setting)
|
8
8
|
right_now = Delayed::Job.db_time_now
|
9
|
-
jobs = reservation_criteria(right_now,
|
10
|
-
jobs = jobs.gte(priority:
|
11
|
-
jobs = jobs.lte(priority:
|
12
|
-
jobs = jobs.any_in(queue:
|
9
|
+
jobs = reservation_criteria(right_now, setting.max_run_time || Delayed::Worker::DEFAULT_MAX_RUN_TIME)
|
10
|
+
jobs = jobs.gte(priority: setting.min_priority.to_i) if setting.min_priority
|
11
|
+
jobs = jobs.lte(priority: setting.max_priority.to_i) if setting.max_priority
|
12
|
+
jobs = jobs.any_in(queue: setting.queues) if setting.queues.any?
|
13
13
|
jobs.count
|
14
14
|
end
|
15
15
|
|
@@ -4,7 +4,7 @@ module Delayed
|
|
4
4
|
def initialize(master)
|
5
5
|
@master = master
|
6
6
|
@logger = master.logger
|
7
|
-
@
|
7
|
+
@workers = master.workers
|
8
8
|
end
|
9
9
|
|
10
10
|
def register
|
@@ -28,9 +28,9 @@ module Delayed
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def dispatch(signal)
|
31
|
-
@
|
32
|
-
next unless
|
33
|
-
dispatch_to(signal,
|
31
|
+
@workers.each do |worker|
|
32
|
+
next unless worker.pid
|
33
|
+
dispatch_to(signal, worker.pid)
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
@@ -0,0 +1,18 @@
|
|
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
|
10
|
+
file.sync = true
|
11
|
+
file.flush
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Delayed
|
2
|
+
class Master
|
3
|
+
class Worker
|
4
|
+
attr_reader :index, :setting
|
5
|
+
attr_accessor :pid, :instance
|
6
|
+
|
7
|
+
def initialize(index, setting)
|
8
|
+
@index = index
|
9
|
+
@setting = setting
|
10
|
+
end
|
11
|
+
|
12
|
+
def title
|
13
|
+
titles = ["delayed_job.#{@index}"]
|
14
|
+
titles << "(#{@setting.queues.join(',')})" if @setting.queues
|
15
|
+
titles.join(' ')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -1,27 +1,27 @@
|
|
1
1
|
module Delayed
|
2
2
|
class Master
|
3
3
|
class WorkerPool
|
4
|
-
def initialize(master, config
|
4
|
+
def initialize(master, config)
|
5
5
|
@master = master
|
6
|
-
@
|
7
|
-
@worker_infos = master.worker_infos
|
6
|
+
@config = config
|
8
7
|
|
9
|
-
@
|
10
|
-
@
|
8
|
+
@logger = master.logger
|
9
|
+
@workers = master.workers
|
11
10
|
|
11
|
+
@static_settings, @dynamic_settings = config.workers.partition { |conf| conf.control == :static }
|
12
12
|
@callback = Delayed::Master::Callback.new(config)
|
13
13
|
end
|
14
14
|
|
15
15
|
def init
|
16
|
-
@
|
17
|
-
|
18
|
-
@
|
19
|
-
fork_worker(
|
20
|
-
@logger.info "started worker #{
|
16
|
+
@static_settings.each_with_index do |setting, i|
|
17
|
+
worker = Delayed::Master::Worker.new(i, setting)
|
18
|
+
@workers << worker
|
19
|
+
fork_worker(worker)
|
20
|
+
@logger.info "started worker #{worker.pid}"
|
21
21
|
end
|
22
22
|
|
23
23
|
@prepared = true
|
24
|
-
|
24
|
+
print_workers
|
25
25
|
end
|
26
26
|
|
27
27
|
def monitor_while(&block)
|
@@ -41,28 +41,31 @@ module Delayed
|
|
41
41
|
|
42
42
|
private
|
43
43
|
|
44
|
-
def fork_worker(
|
45
|
-
@callback.run(:before_fork, @master,
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
worker.
|
44
|
+
def fork_worker(worker)
|
45
|
+
@callback.run(:before_fork, @master, worker)
|
46
|
+
worker.pid = fork do
|
47
|
+
worker.pid = Process.pid
|
48
|
+
worker.instance = create_instance(worker)
|
49
|
+
@callback.run(:after_fork, @master, worker)
|
50
|
+
$0 = worker.title
|
51
|
+
worker.instance.start
|
51
52
|
end
|
52
53
|
end
|
53
54
|
|
54
|
-
def
|
55
|
-
|
56
|
-
[:max_run_time, :max_attempts].each do |key|
|
57
|
-
value =
|
58
|
-
|
55
|
+
def create_instance(worker)
|
56
|
+
instance = Delayed::Worker.new(worker.setting.data)
|
57
|
+
[:max_run_time, :max_attempts, :destroy_failed_jobs].each do |key|
|
58
|
+
if (value = worker.setting.send(key))
|
59
|
+
Delayed::Worker.send("#{key}=", value)
|
60
|
+
end
|
59
61
|
end
|
60
62
|
[:max_memory].each do |key|
|
61
|
-
value =
|
62
|
-
|
63
|
+
if (value = worker.setting.send(key))
|
64
|
+
instance.send("#{key}=", value)
|
65
|
+
end
|
63
66
|
end
|
64
|
-
|
65
|
-
|
67
|
+
instance.master_logger = @logger
|
68
|
+
instance
|
66
69
|
end
|
67
70
|
|
68
71
|
def monitor
|
@@ -76,14 +79,14 @@ module Delayed
|
|
76
79
|
def check_pid
|
77
80
|
pid = wait_pid
|
78
81
|
return unless pid
|
79
|
-
|
80
|
-
return unless
|
82
|
+
worker = @workers.detect { |worker| worker.pid == pid }
|
83
|
+
return unless worker
|
81
84
|
|
82
|
-
case
|
85
|
+
case worker.setting.control
|
83
86
|
when :static
|
84
|
-
fork_alt_worker(
|
87
|
+
fork_alt_worker(worker)
|
85
88
|
when :dynamic
|
86
|
-
@
|
89
|
+
@workers.delete(worker)
|
87
90
|
end
|
88
91
|
end
|
89
92
|
|
@@ -94,43 +97,43 @@ module Delayed
|
|
94
97
|
end
|
95
98
|
|
96
99
|
def check_dynamic_worker
|
97
|
-
@
|
98
|
-
current_count = @
|
99
|
-
remaining_count =
|
100
|
-
if remaining_count > 0 && (job_count =
|
100
|
+
@dynamic_settings.each do |setting|
|
101
|
+
current_count = @workers.count { |worker| worker.setting.queues == setting.queues }
|
102
|
+
remaining_count = setting.count - current_count
|
103
|
+
if remaining_count > 0 && (job_count = count_job(setting)) > 0
|
101
104
|
[remaining_count, job_count].min.times do
|
102
|
-
fork_dynamic_worker(
|
105
|
+
fork_dynamic_worker(setting)
|
103
106
|
end
|
104
107
|
end
|
105
108
|
end
|
106
109
|
end
|
107
110
|
|
108
|
-
def
|
109
|
-
Delayed::Master::JobCounter.count(
|
111
|
+
def count_job(setting)
|
112
|
+
Delayed::Master::JobCounter.count(setting)
|
110
113
|
end
|
111
114
|
|
112
|
-
def fork_dynamic_worker(
|
113
|
-
|
114
|
-
@
|
115
|
+
def fork_dynamic_worker(setting)
|
116
|
+
worker = Delayed::Master::Worker.new(@workers.size, setting)
|
117
|
+
@workers << worker
|
115
118
|
|
116
119
|
@logger.info "forking dynamic worker..."
|
117
|
-
fork_worker(
|
118
|
-
@logger.info "forked worker #{
|
120
|
+
fork_worker(worker)
|
121
|
+
@logger.info "forked worker #{worker.pid}"
|
119
122
|
|
120
|
-
|
123
|
+
print_workers
|
121
124
|
end
|
122
125
|
|
123
|
-
def fork_alt_worker(
|
124
|
-
@logger.info "worker #{
|
125
|
-
fork_worker(
|
126
|
-
@logger.info "forked worker #{
|
126
|
+
def fork_alt_worker(worker)
|
127
|
+
@logger.info "worker #{worker.pid} seems to be killed, forking alternative worker..."
|
128
|
+
fork_worker(worker)
|
129
|
+
@logger.info "forked worker #{worker.pid}"
|
127
130
|
|
128
|
-
|
131
|
+
print_workers
|
129
132
|
end
|
130
133
|
|
131
|
-
def
|
132
|
-
@
|
133
|
-
@logger.debug "#{
|
134
|
+
def print_workers
|
135
|
+
@workers.each do |worker|
|
136
|
+
@logger.debug "#{worker.pid}: #{worker.title}"
|
134
137
|
end
|
135
138
|
end
|
136
139
|
end
|
@@ -34,6 +34,7 @@ add_worker do |worker|
|
|
34
34
|
# worker.max_run_time 4.hours
|
35
35
|
# worker.min_priority 1
|
36
36
|
# worker.max_priority 10
|
37
|
+
# worker.destroy_failed_jobs true
|
37
38
|
end
|
38
39
|
|
39
40
|
# worker2
|
@@ -43,11 +44,11 @@ add_worker do |worker|
|
|
43
44
|
worker.count 2
|
44
45
|
end
|
45
46
|
|
46
|
-
before_fork do |master,
|
47
|
+
before_fork do |master, worker|
|
47
48
|
Delayed::Worker.before_fork if defined?(Delayed::Worker)
|
48
49
|
end
|
49
50
|
|
50
|
-
after_fork do |master,
|
51
|
+
after_fork do |master, worker|
|
51
52
|
Delayed::Worker.after_fork if defined?(Delayed::Worker)
|
52
53
|
end
|
53
54
|
|
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: 1.
|
4
|
+
version: 1.2.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: 2019-04-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: delayed_job
|
@@ -146,6 +146,7 @@ files:
|
|
146
146
|
- ".gitignore"
|
147
147
|
- ".rspec"
|
148
148
|
- ".travis.yml"
|
149
|
+
- CHANGELOG.md
|
149
150
|
- CODE_OF_CONDUCT.md
|
150
151
|
- Gemfile
|
151
152
|
- LICENSE.txt
|
@@ -157,15 +158,15 @@ files:
|
|
157
158
|
- lib/delayed/master.rb
|
158
159
|
- lib/delayed/master/callback.rb
|
159
160
|
- lib/delayed/master/command.rb
|
160
|
-
- lib/delayed/master/
|
161
|
+
- lib/delayed/master/config.rb
|
161
162
|
- lib/delayed/master/job_counter.rb
|
162
163
|
- lib/delayed/master/job_counter/active_record.rb
|
163
164
|
- lib/delayed/master/job_counter/mongoid.rb
|
164
165
|
- lib/delayed/master/signal_handler.rb
|
166
|
+
- lib/delayed/master/util/file_reopener.rb
|
165
167
|
- lib/delayed/master/version.rb
|
166
|
-
- lib/delayed/master/
|
168
|
+
- lib/delayed/master/worker.rb
|
167
169
|
- lib/delayed/master/worker_pool.rb
|
168
|
-
- lib/delayed/util/file_reopener.rb
|
169
170
|
- lib/delayed/worker/extension.rb
|
170
171
|
- lib/delayed/worker/plugins/memory_checker.rb
|
171
172
|
- lib/delayed/worker/plugins/signal_handler.rb
|
@@ -192,8 +193,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
192
193
|
- !ruby/object:Gem::Version
|
193
194
|
version: '0'
|
194
195
|
requirements: []
|
195
|
-
|
196
|
-
rubygems_version: 2.5.2.1
|
196
|
+
rubygems_version: 3.0.3
|
197
197
|
signing_key:
|
198
198
|
specification_version: 4
|
199
199
|
summary: A simple delayed_job master process to control multiple workers
|
data/lib/delayed/master/dsl.rb
DELETED
@@ -1,60 +0,0 @@
|
|
1
|
-
module Delayed
|
2
|
-
class Master
|
3
|
-
class DSL
|
4
|
-
SIMPLE_CONFIGS = [:working_directory, :log_file, :log_level, :pid_file, :monitor_wait]
|
5
|
-
CALLBACK_CONFIGS = [:before_fork, :after_fork, :before_monitor, :after_monitor]
|
6
|
-
|
7
|
-
attr_reader :config
|
8
|
-
|
9
|
-
def initialize(config_file)
|
10
|
-
@config = { worker_configs: [] }
|
11
|
-
instance_eval(File.read(config_file))
|
12
|
-
@config
|
13
|
-
end
|
14
|
-
|
15
|
-
def add_worker
|
16
|
-
setting = WorkerSetting.new(control: :static, count: 1)
|
17
|
-
yield setting
|
18
|
-
setting.config[:exit_on_complete] = true if setting.config[:control] == :dynamic
|
19
|
-
@config[:worker_configs] << setting.config
|
20
|
-
end
|
21
|
-
|
22
|
-
SIMPLE_CONFIGS.each do |key|
|
23
|
-
define_method(key) do |value|
|
24
|
-
@config[key] = value
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
CALLBACK_CONFIGS.each do |key|
|
29
|
-
define_method(key) do |&block|
|
30
|
-
@config[key] = block
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
class WorkerSetting
|
35
|
-
SIMPLE_CONFIGS = [:control, :count, :max_memory,
|
36
|
-
:min_priority, :max_priority, :sleep_delay, :read_ahead, :exit_on_complete,
|
37
|
-
:max_attempts, :max_run_time]
|
38
|
-
ARRAY_CONFIGS = [:queues]
|
39
|
-
|
40
|
-
attr_reader :config
|
41
|
-
|
42
|
-
def initialize(default = {})
|
43
|
-
@config = default
|
44
|
-
end
|
45
|
-
|
46
|
-
SIMPLE_CONFIGS.each do |key|
|
47
|
-
define_method(key) do |value|
|
48
|
-
@config[key] = value
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
ARRAY_CONFIGS.each do |key|
|
53
|
-
define_method(key) do |value|
|
54
|
-
@config[key] = Array(value)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module Delayed
|
2
|
-
class Master
|
3
|
-
class WorkerInfo
|
4
|
-
attr_reader :index, :config
|
5
|
-
attr_accessor :pid
|
6
|
-
|
7
|
-
def initialize(index, config = {})
|
8
|
-
@index = index
|
9
|
-
@config = config
|
10
|
-
end
|
11
|
-
|
12
|
-
def title
|
13
|
-
titles = ["delayed_job.#{@index}"]
|
14
|
-
titles << "(#{@config[:queues].join(',')})" if @config[:queues]
|
15
|
-
titles.join(' ')
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
module Delayed
|
2
|
-
class Util
|
3
|
-
class FileReopener
|
4
|
-
class << self
|
5
|
-
def reopen
|
6
|
-
ObjectSpace.each_object(File) do |file|
|
7
|
-
next if file.closed? || !file.sync
|
8
|
-
file.reopen file.path
|
9
|
-
file.sync = true
|
10
|
-
file.flush
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|