inst-jobs 0.13.7 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 527f11441928b3b0441c6472b38acf010b753efd
4
- data.tar.gz: 3b267f6baafad78f71d62100689fefa5b9d836b9
3
+ metadata.gz: ee8d7326e878b8571d349ec95ae6b6b8870c8ca9
4
+ data.tar.gz: 43c64c727119ba15d95a0a7f2e39c102068c1cce
5
5
  SHA512:
6
- metadata.gz: dbd8d1cfeaada7d63f0fedd65473a83697bee6e585c5b796fb8864925c1afde5c297f8fdee02c38a507d6752acfcffe20b7de82ef85d916cb0096af52cff14cc
7
- data.tar.gz: eb5a1c4dc8c4cd96cbac3158fda68d19f5db202c54c49a71670d68e9ff1dc1396d7e5a050d713abc656e439377e9f53f78a69da353fbeb7c099729ee527b4652
6
+ metadata.gz: b9e12899372899fe7ae9ee0c2e692cbad12244f22f3507279ce7c4f9426f876bb058ef632c53c8c1b70d6c010bb9a7b63c441b6733b8fdfca77d2246ef358381
7
+ data.tar.gz: 4e77f257047f61b065e0505994974d718a4f6a98b3ef956a640dc825f2eee3a6a07d24d10a0e0be017fce9aa034a630809b550460254d94a7eac2c7819306a51
File without changes
@@ -56,15 +56,7 @@ class Daemon
56
56
  alive = status(pid: pid, print: false)
57
57
  if alive == :running || (kill && alive == :draining)
58
58
  puts "Stopping pool #{pid}..."
59
- signal = 'INT'
60
- if kill
61
- pid = -pid # send to the whole group
62
- if kill == 9
63
- signal = 'KILL'
64
- else
65
- signal = 'TERM'
66
- end
67
- end
59
+ signal = kill ? 'TERM' : 'QUIT'
68
60
  begin
69
61
  Process.kill(signal, pid)
70
62
  rescue Errno::ESRCH
@@ -28,5 +28,9 @@ module Delayed
28
28
  def logger
29
29
  Delayed::Logging.logger
30
30
  end
31
+
32
+ def say(message, level = :debug)
33
+ logger.send(level, message)
34
+ end
31
35
  end
32
36
  end
data/lib/delayed/pool.rb CHANGED
@@ -1,8 +1,13 @@
1
1
  module Delayed
2
2
  class Pool
3
+ include Delayed::Logging
4
+
3
5
  mattr_accessor :on_fork
4
6
  self.on_fork = ->{ }
5
7
 
8
+ SIGNALS = %i{INT TERM QUIT}
9
+ POOL_SLEEP_PERIOD = 5
10
+
6
11
  attr_reader :workers
7
12
 
8
13
  def initialize(*args)
@@ -12,6 +17,8 @@ class Pool
12
17
  warn "Calling Delayed::Pool.new directly is deprecated. Use `Delayed::CLI.new.run()` instead."
13
18
  end
14
19
  @workers = {}
20
+ @signal_queue = []
21
+ @self_pipe = IO.pipe
15
22
  end
16
23
 
17
24
  def run
@@ -21,6 +28,7 @@ class Pool
21
28
 
22
29
  def start
23
30
  say "Started job master", :info
31
+ SIGNALS.each { |sig| trap(sig) { @signal_queue << sig; wake_up } }
24
32
  $0 = procname
25
33
  # fork to handle unlocking (to prevent polluting the parent with worker objects)
26
34
  unlock_pid = fork_with_reconnects do
@@ -33,8 +41,8 @@ class Pool
33
41
  say "Workers spawned"
34
42
  join
35
43
  say "Shutting down"
36
- rescue Interrupt => e
37
- say "Signal received, exiting", :info
44
+ stop
45
+ reap_all_children
38
46
  rescue Exception => e
39
47
  say "Job master died with error: #{e.inspect}\n#{e.backtrace.join("\n")}", :fatal
40
48
  raise
@@ -46,14 +54,6 @@ class Pool
46
54
  "delayed_jobs_pool#{Settings.pool_procname_suffix}"
47
55
  end
48
56
 
49
- def say(msg, level = :debug)
50
- if defined?(Rails.logger) && Rails.logger
51
- Rails.logger.send(level, "[#{Process.pid}]P #{msg}")
52
- else
53
- puts(msg)
54
- end
55
- end
56
-
57
57
  def unlock_orphaned_jobs(worker = nil, pid = nil)
58
58
  return if Settings.disable_automatic_orphan_unlocking
59
59
 
@@ -136,26 +136,102 @@ class Pool
136
136
 
137
137
  def join
138
138
  loop do
139
- child = Process.wait
140
- if workers.include?(child)
141
- worker = workers.delete(child)
142
- case worker
143
- when :periodic_audit
144
- say "ran auditor: #{worker}"
145
- when :work_queue
146
- say "work queue exited, restarting", :info
147
- spawn_work_queue
148
- else
149
- say "child exited: #{child}, restarting", :info
150
- # fork to handle unlocking (to prevent polluting the parent with worker objects)
151
- unlock_pid = fork_with_reconnects do
152
- unlock_orphaned_jobs(worker, child)
153
- end
154
- Process.wait unlock_pid
155
- spawn_worker(worker.config)
139
+ maintain_children
140
+ case sig = @signal_queue.shift
141
+ when nil
142
+ pool_sleep
143
+ when :QUIT
144
+ break
145
+ when :TERM, :INT
146
+ stop(graceful: false) if Settings.kill_workers_on_exit
147
+ break
148
+ else
149
+ logger.warn("Unexpected signal received: #{sig}")
150
+ end
151
+ end
152
+ end
153
+
154
+ def pool_sleep
155
+ IO.select([@self_pipe[0]], nil, nil, POOL_SLEEP_PERIOD)
156
+ @self_pipe[0].read_nonblock(11, exception: false)
157
+ end
158
+
159
+ def stop(graceful: true, timeout: Settings.slow_exit_timeout)
160
+ signal_for_children = graceful ? :QUIT : :TERM
161
+ if Settings.kill_workers_on_exit
162
+ limit = Time.now + timeout
163
+ until @workers.empty? || Time.now >= limit
164
+ signal_all_children(signal_for_children)
165
+ # Give our children some time to process the signal before checking if
166
+ # they've exited
167
+ sleep(0.5)
168
+ reap_all_children.each { |pid| @workers.delete(pid) }
169
+ end
170
+
171
+ # We really want to give the workers every oportunity to clean up after
172
+ # themselves before murdering them.
173
+ stop(graceful: false, timeout: 2) if graceful
174
+ signal_all_children(:KILL)
175
+ else
176
+ signal_all_children(signal_for_children)
177
+ end
178
+ end
179
+
180
+ def signal_all_children(signal)
181
+ workers.keys.each { |pid| signal_child(signal, pid) }
182
+ end
183
+
184
+ def signal_child(signal, pid)
185
+ Process.kill(signal, pid)
186
+ rescue Erron::ESRCH
187
+ workers.delete(pid)
188
+ end
189
+
190
+ # Respawn all children that have exited since we last checked
191
+ def maintain_children
192
+ reap_all_children.each do |pid|
193
+ respawn_child(pid)
194
+ end
195
+ end
196
+
197
+ # Reaps processes that have exited or just returns if none have exited
198
+ #
199
+ # @return Array An array of child pids that have exited
200
+ def reap_all_children
201
+ exited_pids = []
202
+ begin
203
+ pid = Process.wait(-1, Process::WNOHANG)
204
+ break unless pid
205
+ exited_pids << pid
206
+ rescue Errno::ECHILD
207
+ break
208
+ end while true # I hate doing loops this way but it's the only way to make the rescue work
209
+ exited_pids
210
+ end
211
+
212
+ def respawn_child(child)
213
+ if workers.include?(child)
214
+ worker = workers.delete(child)
215
+ case worker
216
+ when :periodic_audit
217
+ say "ran auditor: #{worker}"
218
+ when :work_queue
219
+ say "work queue exited, restarting", :info
220
+ spawn_work_queue
221
+ else
222
+ say "child exited: #{child}, restarting", :info
223
+ # fork to handle unlocking (to prevent polluting the parent with worker objects)
224
+ unlock_pid = fork_with_reconnects do
225
+ unlock_orphaned_jobs(worker, child)
156
226
  end
227
+ Process.wait unlock_pid
228
+ spawn_worker(worker.config)
157
229
  end
158
230
  end
159
231
  end
232
+
233
+ def wake_up
234
+ @self_pipe[1].write_nonblock('.', exception: false)
235
+ end
160
236
  end
161
237
  end
@@ -5,19 +5,21 @@ require 'active_support/core_ext/hash/indifferent_access'
5
5
  module Delayed
6
6
  module Settings
7
7
  SETTINGS = [
8
- :queue,
9
- :max_attempts,
10
- :sleep_delay,
11
- :sleep_delay_stagger,
12
- :fetch_batch_size,
13
- :select_random_from_batch,
14
- :worker_procname_prefix,
15
- :pool_procname_suffix,
16
8
  :default_job_options,
17
- :silence_periodic_log,
18
9
  :disable_periodic_jobs,
19
10
  :disable_automatic_orphan_unlocking,
11
+ :fetch_batch_size,
12
+ :kill_workers_on_exit,
20
13
  :last_ditch_logfile,
14
+ :max_attempts,
15
+ :pool_procname_suffix,
16
+ :queue,
17
+ :select_random_from_batch,
18
+ :silence_periodic_log,
19
+ :sleep_delay,
20
+ :sleep_delay_stagger,
21
+ :slow_exit_timeout,
22
+ :worker_procname_prefix,
21
23
  ]
22
24
  SETTINGS_WITH_ARGS = [ :num_strands ]
23
25
 
@@ -62,6 +64,11 @@ module Delayed
62
64
  self.num_strands = ->(strand_name){ nil }
63
65
  self.default_job_options = ->{ Hash.new }
64
66
 
67
+ # Send workers KILL after QUIT if they haven't exited within the
68
+ # slow_exit_timeout
69
+ self.kill_workers_on_exit = true
70
+ self.slow_exit_timeout = 20
71
+
65
72
  def self.worker_config(config_filename = nil)
66
73
  config_filename ||= default_worker_config_name
67
74
  config = YAML.load(ERB.new(File.read(config_filename)).result)
@@ -1,3 +1,3 @@
1
1
  module Delayed
2
- VERSION = "0.13.7"
2
+ VERSION = "0.14.0"
3
3
  end
@@ -12,6 +12,10 @@ class InProcess
12
12
  worker_config[:max_priority])
13
13
  end
14
14
  end
15
+
16
+ # intentional nops for compatibility w/ parent process
17
+ def close; end
18
+ def wake_up; end
15
19
  end
16
20
  end
17
21
  end
@@ -9,6 +9,11 @@ class ParentProcess
9
9
  def initialize(addrinfo, config: Settings.parent_process)
10
10
  @addrinfo = addrinfo
11
11
  @connect_timeout = config['client_connect_timeout'] || 2
12
+ @self_pipe = IO.pipe
13
+ end
14
+
15
+ def close
16
+ reset_connection
12
17
  end
13
18
 
14
19
  def get_and_lock_next_available(worker_name, worker_config)
@@ -24,11 +29,18 @@ class ParentProcess
24
29
  return reset_connection
25
30
  end
26
31
 
27
- Marshal.load(socket).tap do |response|
28
- unless response.nil? || (response.is_a?(Delayed::Job) && response.locked_by == worker_name)
29
- raise(ProtocolError, "response is not a locked job: #{response.inspect}")
32
+ readers, _, _ = IO.select([socket, @self_pipe[0]])
33
+
34
+ if readers.include?(@self_pipe[0])
35
+ # we're probably exiting so we just want to break out of the blocking read
36
+ logger.debug("Broke out of select due to being awakened, exiting")
37
+ else
38
+ Marshal.load(socket).tap do |response|
39
+ unless response.nil? || (response.is_a?(Delayed::Job) && response.locked_by == worker_name)
40
+ raise(ProtocolError, "response is not a locked job: #{response.inspect}")
41
+ end
42
+ logger.debug("Received job #{response.id}")
30
43
  end
31
- logger.debug("Received job #{response.id}")
32
44
  end
33
45
  rescue SystemCallError, IOError => ex
34
46
  logger.error("Work queue connection lost, reestablishing on next poll. (#{ex})")
@@ -37,6 +49,10 @@ class ParentProcess
37
49
  reset_connection
38
50
  end
39
51
 
52
+ def wake_up
53
+ @self_pipe[1].write_nonblock('.', exception: false)
54
+ end
55
+
40
56
  private
41
57
 
42
58
  def socket
@@ -5,6 +5,7 @@ class ParentProcess
5
5
  attr_reader :clients, :listen_socket
6
6
 
7
7
  include Delayed::Logging
8
+ SIGNALS = %i{INT TERM QUIT CHLD}
8
9
 
9
10
  def initialize(listen_socket, parent_pid: nil, config: Settings.parent_process)
10
11
  @listen_socket = listen_socket
@@ -15,6 +16,9 @@ class ParentProcess
15
16
 
16
17
  @config = config
17
18
  @client_timeout = config['server_socket_timeout'] || 10.0 # left for backwards compat
19
+
20
+ @exit = false
21
+ @self_pipe = IO.pipe
18
22
  end
19
23
 
20
24
  def connected_clients
@@ -30,6 +34,13 @@ class ParentProcess
30
34
  def run
31
35
  logger.debug "Starting work queue process"
32
36
 
37
+ SIGNALS.each do |sig|
38
+ # We're not doing any aggressive exiting here since we really want
39
+ # prefetched jobs to be unlocked and we're going to wake up the process
40
+ # from the IO.select we're using to wait on clients.
41
+ trap(sig) { @exit = true; @self_pipe[1].write_nonblock('.', exception: false) }
42
+ end
43
+
33
44
  last_orphaned_prefetched_jobs_purge = Job.db_time_now - rand(15 * 60)
34
45
  while !exit?
35
46
  run_once
@@ -47,7 +58,7 @@ class ParentProcess
47
58
  end
48
59
 
49
60
  def run_once
50
- handles = @clients.keys + [@listen_socket]
61
+ handles = @clients.keys + [@listen_socket, @self_pipe[0]]
51
62
  timeout = Settings.sleep_delay + (rand * Settings.sleep_delay_stagger)
52
63
  readable, _, _ = IO.select(handles, nil, nil, timeout)
53
64
  if readable
@@ -60,6 +71,10 @@ class ParentProcess
60
71
  def handle_read(socket)
61
72
  if socket == @listen_socket
62
73
  handle_accept
74
+ elsif socket == @self_pipe[0]
75
+ # We really don't care about the contents of the pipe, we just need to
76
+ # wake up.
77
+ @self_pipe[0].read_nonblock(11, exception: false)
63
78
  else
64
79
  handle_request(socket)
65
80
  end
@@ -194,7 +209,7 @@ class ParentProcess
194
209
  end
195
210
 
196
211
  def exit?
197
- parent_exited?
212
+ !!@exit || parent_exited?
198
213
  end
199
214
 
200
215
  def prefetch_owner
@@ -6,6 +6,9 @@ require 'tmpdir'
6
6
  require 'set'
7
7
 
8
8
  class Worker
9
+ include Delayed::Logging
10
+ SIGNALS = %i{INT TERM QUIT CHLD}
11
+
9
12
  attr_reader :config, :queue_name, :min_priority, :max_priority, :work_queue
10
13
 
11
14
  # Callback to fire when a delayed job fails max_attempts times. If this
@@ -51,13 +54,16 @@ class Worker
51
54
  @config = options
52
55
  @job_count = 0
53
56
 
57
+ @self_pipe = IO.pipe
58
+ @signal_queue = []
59
+
54
60
  app = Rails.application
55
61
  if app && !app.config.cache_classes
56
- Delayed::Worker.lifecycle.around(:perform) do |&block|
62
+ Delayed::Worker.lifecycle.around(:perform) do |worker, job, &block|
57
63
  reload = app.config.reload_classes_only_on_change != true || app.reloaders.map(&:updated?).any?
58
64
  ActionDispatch::Reloader.prepare! if reload
59
65
  begin
60
- block.call
66
+ block.call(worker, job)
61
67
  ensure
62
68
  ActionDispatch::Reloader.cleanup! if reload
63
69
  end
@@ -76,27 +82,49 @@ class Worker
76
82
  end
77
83
 
78
84
  def exit?
79
- @exit || parent_exited?
85
+ @exit
80
86
  end
81
87
 
82
- def parent_exited?
83
- @parent_pid && @parent_pid != Process.ppid
88
+ def wake_up
89
+ @self_pipe[1].write_nonblock('.', exception: false)
90
+ work_queue.wake_up
84
91
  end
85
92
 
86
93
  def start
87
- say "Starting worker", :info
94
+ logger.info "Starting worker"
88
95
  set_process_name("start:#{Settings.worker_procname_prefix}#{@queue_name}:#{min_priority || 0}:#{max_priority || 'max'}")
89
96
 
90
- trap('INT') { say 'Exiting'; @exit = true }
97
+ work_thread = Thread.current
98
+ SIGNALS.each do |sig|
99
+ trap(sig) { @signal_queue << sig; wake_up }
100
+ end
91
101
 
92
- self.class.lifecycle.run_callbacks(:execute, self) do
102
+ signal_processor = Thread.new do
93
103
  loop do
104
+ @self_pipe[0].read(1)
105
+ case @signal_queue.pop
106
+ when :INT, :TERM
107
+ @exit = true # get the main thread to bail early if it's waiting for a job
108
+ work_thread.raise(SystemExit) # Force the main thread to bail out of the current job
109
+ break
110
+ when :QUIT, :CHLD
111
+ @exit = true
112
+ else
113
+ logger.error "Unknown signal '#{sig}' received"
114
+ end
115
+ end
116
+ end
117
+
118
+ self.class.lifecycle.run_callbacks(:execute, self) do
119
+ until exit? do
94
120
  run
95
- break if exit?
96
121
  end
97
122
  end
98
123
 
99
- say "Stopping worker", :info
124
+ work_queue.close
125
+ signal_processor.kill
126
+ signal_processor.join
127
+ logger.info "Stopping worker"
100
128
  rescue => e
101
129
  Rails.logger.fatal("Child process died: #{e.inspect}") rescue nil
102
130
  self.class.lifecycle.run_callbacks(:exceptional_exit, self, e) { }
@@ -105,6 +133,7 @@ class Worker
105
133
  end
106
134
 
107
135
  def run
136
+ return if exit?
108
137
  self.class.lifecycle.run_callbacks(:loop, self) do
109
138
  set_process_name("pop:#{Settings.worker_procname_prefix}#{@queue_name}:#{min_priority || 0}:#{max_priority || 'max'}")
110
139
  job = self.class.lifecycle.run_callbacks(:pop, self) do
@@ -116,23 +145,23 @@ class Worker
116
145
  @job_count += perform(job)
117
146
 
118
147
  if @max_job_count > 0 && @job_count >= @max_job_count
119
- say "Max job count of #{@max_job_count} exceeded, dying"
148
+ logger.debug "Max job count of #{@max_job_count} exceeded, dying"
120
149
  @exit = true
121
150
  end
122
151
 
123
152
  if @max_memory_usage > 0
124
153
  memory = sample_memory
125
154
  if memory > @max_memory_usage
126
- say "Memory usage of #{memory} exceeds max of #{@max_memory_usage}, dying"
155
+ logger.debug "Memory usage of #{memory} exceeds max of #{@max_memory_usage}, dying"
127
156
  @exit = true
128
157
  else
129
- say "Memory usage: #{memory}"
158
+ logger.debug "Memory usage: #{memory}"
130
159
  end
131
160
  end
132
161
  end
133
162
  else
134
163
  set_process_name("wait:#{Settings.worker_procname_prefix}#{@queue_name}:#{min_priority || 0}:#{max_priority || 'max'}")
135
- sleep(Settings.sleep_delay + (rand * Settings.sleep_delay_stagger))
164
+ sleep(Settings.sleep_delay + (rand * Settings.sleep_delay_stagger)) unless exit?
136
165
  end
137
166
  end
138
167
  end
@@ -142,7 +171,7 @@ class Worker
142
171
  raise Delayed::Backend::JobExpired, "job expired at #{job.expires_at}" if job.expired?
143
172
  self.class.lifecycle.run_callbacks(:perform, self, job) do
144
173
  set_process_name("run:#{Settings.worker_procname_prefix}#{job.id}:#{job.name}")
145
- say("Processing #{log_job(job, :long)}", :info)
174
+ logger.info("Processing #{log_job(job, :long)}")
146
175
  runtime = Benchmark.realtime do
147
176
  if job.batch?
148
177
  # each job in the batch will have perform called on it, so we don't
@@ -153,9 +182,14 @@ class Worker
153
182
  end
154
183
  job.destroy
155
184
  end
156
- say("Completed #{log_job(job)} #{"%.0fms" % (runtime * 1000)}", :info)
185
+ logger.info("Completed #{log_job(job)} #{"%.0fms" % (runtime * 1000)}")
157
186
  end
158
187
  count
188
+ rescue SystemExit
189
+ # There wasn't really a failure here so no callbacks and whatnot needed,
190
+ # still reschedule the job though.
191
+ job.reschedule
192
+ count
159
193
  rescue Exception => e
160
194
  self.class.lifecycle.run_callbacks(:error, self, job, e) do
161
195
  handle_failed_job(job, e)
@@ -179,7 +213,7 @@ class Worker
179
213
 
180
214
  def handle_failed_job(job, error)
181
215
  job.last_error = "#{error.message}\n#{error.backtrace.join("\n")}"
182
- say("Failed with #{error.class} [#{error.message}] (#{job.attempts} attempts)", :error)
216
+ logger.error("Failed with #{error.class} [#{error.message}] (#{job.attempts} attempts)")
183
217
  job.reschedule(error)
184
218
  end
185
219
 
@@ -187,10 +221,6 @@ class Worker
187
221
  Process.pid
188
222
  end
189
223
 
190
- def say(msg, level = :debug)
191
- Rails.logger.send(level, msg)
192
- end
193
-
194
224
  def log_job(job, format = :short)
195
225
  case format
196
226
  when :long
@@ -24,10 +24,10 @@ RSpec.describe Delayed::Daemon do
24
24
  subject.stop
25
25
  end
26
26
 
27
- it 'sends INT by default' do
27
+ it 'sends QUIT by default' do
28
28
  expect(subject).to receive(:status).with(print: false, pid: pid).and_return(:running)
29
29
  expect(subject).to receive(:puts).with(/Stopping pool/)
30
- expect(Process).to receive(:kill).with('INT', pid)
30
+ expect(Process).to receive(:kill).with('QUIT', pid)
31
31
  expect(subject).to receive(:wait).with(false)
32
32
  subject.stop
33
33
  end
@@ -21,6 +21,7 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Client do
21
21
  it 'marshals the given arguments to the server and returns the response' do
22
22
  expect(addrinfo).to receive(:connect).once.and_return(connection)
23
23
  expect(connection).to receive(:eof?).and_return(false)
24
+ expect(IO).to receive(:select).and_return([[connection], nil, nil])
24
25
  expect(Marshal).to receive(:dump).with(args, connection).ordered
25
26
  expect(Marshal).to receive(:load).with(connection).and_return(job).ordered
26
27
  response = subject.get_and_lock_next_available(*args)
@@ -30,6 +31,7 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Client do
30
31
  it 'returns nil and then reconnects on socket write error' do
31
32
  expect(addrinfo).to receive(:connect).once.and_return(connection)
32
33
  expect(Marshal).to receive(:dump).and_raise(SystemCallError.new("failure"))
34
+ expect(IO).to receive(:select).and_return([[connection], nil, nil])
33
35
  expect(connection).to receive(:close)
34
36
  response = subject.get_and_lock_next_available(*args)
35
37
  expect(response).to be_nil
@@ -46,6 +48,7 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Client do
46
48
  expect(addrinfo).to receive(:connect).once.and_return(connection)
47
49
  expect(connection).to receive(:eof?).and_return(true)
48
50
  expect(Marshal).to receive(:dump).with(args, connection).ordered
51
+ expect(IO).to receive(:select).and_return([[connection], nil, nil])
49
52
  expect(connection).to receive(:close)
50
53
  response = subject.get_and_lock_next_available(*args)
51
54
  expect(response).to be_nil
@@ -61,6 +64,7 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Client do
61
64
  it 'errors if the response is not a locked job' do
62
65
  expect(addrinfo).to receive(:connect).once.and_return(connection)
63
66
  expect(Marshal).to receive(:dump).with(args, connection)
67
+ expect(IO).to receive(:select).and_return([[connection], nil, nil])
64
68
  expect(Marshal).to receive(:load).with(connection).and_return(:not_a_job)
65
69
  expect(connection).to receive(:eof?).and_return(false)
66
70
 
@@ -71,6 +75,7 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Client do
71
75
  expect(addrinfo).to receive(:connect).once.and_return(connection)
72
76
  expect(Marshal).to receive(:dump).with(args, connection)
73
77
  job.locked_by = "somebody_else"
78
+ expect(IO).to receive(:select).and_return([[connection], nil, nil])
74
79
  expect(Marshal).to receive(:load).with(connection).and_return(job)
75
80
  expect(connection).to receive(:eof?).and_return(false)
76
81
 
@@ -1,98 +1,100 @@
1
1
  PATH
2
2
  remote: ../..
3
3
  specs:
4
- inst-jobs (0.12.3)
5
- after_transaction_commit (~> 1.0)
4
+ inst-jobs (0.13.4)
5
+ after_transaction_commit (>= 1.0, < 3)
6
6
  rails (>= 4.2)
7
7
  redis (> 3.0)
8
8
  redis-scripting (~> 1.0.1)
9
- rufus-scheduler (~> 3.3.2)
9
+ rufus-scheduler (~> 3.4)
10
10
 
11
11
  GEM
12
12
  remote: https://rubygems.org/
13
13
  specs:
14
- actionmailer (4.2.8)
15
- actionpack (= 4.2.8)
16
- actionview (= 4.2.8)
17
- activejob (= 4.2.8)
14
+ actionmailer (4.2.9)
15
+ actionpack (= 4.2.9)
16
+ actionview (= 4.2.9)
17
+ activejob (= 4.2.9)
18
18
  mail (~> 2.5, >= 2.5.4)
19
19
  rails-dom-testing (~> 1.0, >= 1.0.5)
20
- actionpack (4.2.8)
21
- actionview (= 4.2.8)
22
- activesupport (= 4.2.8)
20
+ actionpack (4.2.9)
21
+ actionview (= 4.2.9)
22
+ activesupport (= 4.2.9)
23
23
  rack (~> 1.6)
24
24
  rack-test (~> 0.6.2)
25
25
  rails-dom-testing (~> 1.0, >= 1.0.5)
26
26
  rails-html-sanitizer (~> 1.0, >= 1.0.2)
27
- actionview (4.2.8)
28
- activesupport (= 4.2.8)
27
+ actionview (4.2.9)
28
+ activesupport (= 4.2.9)
29
29
  builder (~> 3.1)
30
30
  erubis (~> 2.7.0)
31
31
  rails-dom-testing (~> 1.0, >= 1.0.5)
32
32
  rails-html-sanitizer (~> 1.0, >= 1.0.3)
33
- activejob (4.2.8)
34
- activesupport (= 4.2.8)
33
+ activejob (4.2.9)
34
+ activesupport (= 4.2.9)
35
35
  globalid (>= 0.3.0)
36
- activemodel (4.2.8)
37
- activesupport (= 4.2.8)
36
+ activemodel (4.2.9)
37
+ activesupport (= 4.2.9)
38
38
  builder (~> 3.1)
39
- activerecord (4.2.8)
40
- activemodel (= 4.2.8)
41
- activesupport (= 4.2.8)
39
+ activerecord (4.2.9)
40
+ activemodel (= 4.2.9)
41
+ activesupport (= 4.2.9)
42
42
  arel (~> 6.0)
43
- activesupport (4.2.8)
43
+ activesupport (4.2.9)
44
44
  i18n (~> 0.7)
45
45
  minitest (~> 5.1)
46
46
  thread_safe (~> 0.3, >= 0.3.4)
47
47
  tzinfo (~> 1.1)
48
- after_transaction_commit (1.1.1)
48
+ after_transaction_commit (1.1.2)
49
49
  activerecord (>= 4.0)
50
50
  arel (6.0.4)
51
- backports (3.7.0)
51
+ backports (3.8.0)
52
52
  builder (3.2.3)
53
- bump (0.5.3)
53
+ bump (0.5.4)
54
54
  byebug (9.0.6)
55
55
  coderay (1.1.1)
56
56
  concurrent-ruby (1.0.5)
57
- database_cleaner (1.3.0)
57
+ database_cleaner (1.6.1)
58
58
  diff-lcs (1.3)
59
59
  erubis (2.7.0)
60
+ et-orbi (1.0.5)
61
+ tzinfo
60
62
  globalid (0.4.0)
61
63
  activesupport (>= 4.2.0)
62
- i18n (0.8.1)
64
+ i18n (0.8.6)
63
65
  loofah (2.0.3)
64
66
  nokogiri (>= 1.5.9)
65
- mail (2.6.4)
67
+ mail (2.6.6)
66
68
  mime-types (>= 1.16, < 4)
67
69
  method_source (0.8.2)
68
70
  mime-types (3.1)
69
71
  mime-types-data (~> 3.2015)
70
72
  mime-types-data (3.2016.0521)
71
- mini_portile2 (2.1.0)
72
- minitest (5.10.1)
73
+ mini_portile2 (2.2.0)
74
+ minitest (5.10.3)
73
75
  multi_json (1.12.1)
74
- nokogiri (1.7.1)
75
- mini_portile2 (~> 2.1.0)
76
- pg (0.20.0)
76
+ nokogiri (1.8.0)
77
+ mini_portile2 (~> 2.2.0)
78
+ pg (0.21.0)
77
79
  pry (0.10.4)
78
80
  coderay (~> 1.1.0)
79
81
  method_source (~> 0.8.1)
80
82
  slop (~> 3.4)
81
- rack (1.6.5)
83
+ rack (1.6.8)
82
84
  rack-protection (1.5.3)
83
85
  rack
84
86
  rack-test (0.6.3)
85
87
  rack (>= 1.0)
86
- rails (4.2.8)
87
- actionmailer (= 4.2.8)
88
- actionpack (= 4.2.8)
89
- actionview (= 4.2.8)
90
- activejob (= 4.2.8)
91
- activemodel (= 4.2.8)
92
- activerecord (= 4.2.8)
93
- activesupport (= 4.2.8)
88
+ rails (4.2.9)
89
+ actionmailer (= 4.2.9)
90
+ actionpack (= 4.2.9)
91
+ actionview (= 4.2.9)
92
+ activejob (= 4.2.9)
93
+ activemodel (= 4.2.9)
94
+ activerecord (= 4.2.9)
95
+ activesupport (= 4.2.9)
94
96
  bundler (>= 1.3.0, < 2.0)
95
- railties (= 4.2.8)
97
+ railties (= 4.2.9)
96
98
  sprockets-rails
97
99
  rails-deprecated_sanitizer (1.0.3)
98
100
  activesupport (>= 4.2.0.alpha)
@@ -102,9 +104,9 @@ GEM
102
104
  rails-deprecated_sanitizer (>= 1.0.1)
103
105
  rails-html-sanitizer (1.0.3)
104
106
  loofah (~> 2.0)
105
- railties (4.2.8)
106
- actionpack (= 4.2.8)
107
- activesupport (= 4.2.8)
107
+ railties (4.2.9)
108
+ actionpack (= 4.2.9)
109
+ activesupport (= 4.2.9)
108
110
  rake (>= 0.8.7)
109
111
  thor (>= 0.18.1, < 2.0)
110
112
  rake (12.0.0)
@@ -124,8 +126,8 @@ GEM
124
126
  diff-lcs (>= 1.2.0, < 2.0)
125
127
  rspec-support (~> 3.4.0)
126
128
  rspec-support (3.4.1)
127
- rufus-scheduler (3.3.4)
128
- tzinfo
129
+ rufus-scheduler (3.4.2)
130
+ et-orbi (~> 1.0)
129
131
  sinatra (1.4.8)
130
132
  rack (~> 1.5)
131
133
  rack-protection (~> 1.4)
@@ -149,7 +151,7 @@ GEM
149
151
  activerecord (>= 3.2)
150
152
  thor (0.19.4)
151
153
  thread_safe (0.3.6)
152
- tilt (2.0.7)
154
+ tilt (2.0.8)
153
155
  timecop (0.7.1)
154
156
  tzinfo (1.2.3)
155
157
  thread_safe (~> 0.1)
@@ -159,9 +161,10 @@ PLATFORMS
159
161
  ruby
160
162
 
161
163
  DEPENDENCIES
164
+ after_transaction_commit (< 2)
162
165
  bump
163
166
  byebug
164
- database_cleaner (= 1.3.0)
167
+ database_cleaner (= 1.6.1)
165
168
  inst-jobs!
166
169
  pg
167
170
  pry
@@ -176,4 +179,4 @@ DEPENDENCIES
176
179
  wwtd (~> 1.3.0)
177
180
 
178
181
  BUNDLED WITH
179
- 1.14.6
182
+ 1.15.3
@@ -1,113 +1,115 @@
1
1
  PATH
2
2
  remote: ../..
3
3
  specs:
4
- inst-jobs (0.12.3)
5
- after_transaction_commit (~> 1.0)
4
+ inst-jobs (0.13.4)
5
+ after_transaction_commit (>= 1.0, < 3)
6
6
  rails (>= 4.2)
7
7
  redis (> 3.0)
8
8
  redis-scripting (~> 1.0.1)
9
- rufus-scheduler (~> 3.3.2)
9
+ rufus-scheduler (~> 3.4)
10
10
 
11
11
  GEM
12
12
  remote: https://rubygems.org/
13
13
  specs:
14
- actioncable (5.0.2)
15
- actionpack (= 5.0.2)
14
+ actioncable (5.0.5)
15
+ actionpack (= 5.0.5)
16
16
  nio4r (>= 1.2, < 3.0)
17
17
  websocket-driver (~> 0.6.1)
18
- actionmailer (5.0.2)
19
- actionpack (= 5.0.2)
20
- actionview (= 5.0.2)
21
- activejob (= 5.0.2)
18
+ actionmailer (5.0.5)
19
+ actionpack (= 5.0.5)
20
+ actionview (= 5.0.5)
21
+ activejob (= 5.0.5)
22
22
  mail (~> 2.5, >= 2.5.4)
23
23
  rails-dom-testing (~> 2.0)
24
- actionpack (5.0.2)
25
- actionview (= 5.0.2)
26
- activesupport (= 5.0.2)
24
+ actionpack (5.0.5)
25
+ actionview (= 5.0.5)
26
+ activesupport (= 5.0.5)
27
27
  rack (~> 2.0)
28
28
  rack-test (~> 0.6.3)
29
29
  rails-dom-testing (~> 2.0)
30
30
  rails-html-sanitizer (~> 1.0, >= 1.0.2)
31
- actionview (5.0.2)
32
- activesupport (= 5.0.2)
31
+ actionview (5.0.5)
32
+ activesupport (= 5.0.5)
33
33
  builder (~> 3.1)
34
34
  erubis (~> 2.7.0)
35
35
  rails-dom-testing (~> 2.0)
36
36
  rails-html-sanitizer (~> 1.0, >= 1.0.3)
37
- activejob (5.0.2)
38
- activesupport (= 5.0.2)
37
+ activejob (5.0.5)
38
+ activesupport (= 5.0.5)
39
39
  globalid (>= 0.3.6)
40
- activemodel (5.0.2)
41
- activesupport (= 5.0.2)
42
- activerecord (5.0.2)
43
- activemodel (= 5.0.2)
44
- activesupport (= 5.0.2)
40
+ activemodel (5.0.5)
41
+ activesupport (= 5.0.5)
42
+ activerecord (5.0.5)
43
+ activemodel (= 5.0.5)
44
+ activesupport (= 5.0.5)
45
45
  arel (~> 7.0)
46
- activesupport (5.0.2)
46
+ activesupport (5.0.5)
47
47
  concurrent-ruby (~> 1.0, >= 1.0.2)
48
48
  i18n (~> 0.7)
49
49
  minitest (~> 5.1)
50
50
  tzinfo (~> 1.1)
51
- after_transaction_commit (1.1.1)
52
- activerecord (>= 4.0)
51
+ after_transaction_commit (2.0.0)
52
+ activerecord (>= 5.0)
53
53
  arel (7.1.4)
54
- backports (3.7.0)
54
+ backports (3.8.0)
55
55
  builder (3.2.3)
56
- bump (0.5.3)
56
+ bump (0.5.4)
57
57
  byebug (9.0.6)
58
58
  coderay (1.1.1)
59
59
  concurrent-ruby (1.0.5)
60
- database_cleaner (1.3.0)
60
+ database_cleaner (1.6.1)
61
61
  diff-lcs (1.3)
62
62
  erubis (2.7.0)
63
+ et-orbi (1.0.5)
64
+ tzinfo
63
65
  globalid (0.4.0)
64
66
  activesupport (>= 4.2.0)
65
- i18n (0.8.1)
67
+ i18n (0.8.6)
66
68
  loofah (2.0.3)
67
69
  nokogiri (>= 1.5.9)
68
- mail (2.6.4)
70
+ mail (2.6.6)
69
71
  mime-types (>= 1.16, < 4)
70
72
  method_source (0.8.2)
71
73
  mime-types (3.1)
72
74
  mime-types-data (~> 3.2015)
73
75
  mime-types-data (3.2016.0521)
74
- mini_portile2 (2.1.0)
75
- minitest (5.10.1)
76
+ mini_portile2 (2.2.0)
77
+ minitest (5.10.3)
76
78
  multi_json (1.12.1)
77
79
  mustermann (1.0.0.beta2)
78
- nio4r (2.0.0)
79
- nokogiri (1.7.1)
80
- mini_portile2 (~> 2.1.0)
81
- pg (0.20.0)
80
+ nio4r (2.1.0)
81
+ nokogiri (1.8.0)
82
+ mini_portile2 (~> 2.2.0)
83
+ pg (0.21.0)
82
84
  pry (0.10.4)
83
85
  coderay (~> 1.1.0)
84
86
  method_source (~> 0.8.1)
85
87
  slop (~> 3.4)
86
- rack (2.0.1)
88
+ rack (2.0.3)
87
89
  rack-protection (2.0.0.beta2)
88
90
  rack
89
91
  rack-test (0.6.3)
90
92
  rack (>= 1.0)
91
- rails (5.0.2)
92
- actioncable (= 5.0.2)
93
- actionmailer (= 5.0.2)
94
- actionpack (= 5.0.2)
95
- actionview (= 5.0.2)
96
- activejob (= 5.0.2)
97
- activemodel (= 5.0.2)
98
- activerecord (= 5.0.2)
99
- activesupport (= 5.0.2)
100
- bundler (>= 1.3.0, < 2.0)
101
- railties (= 5.0.2)
93
+ rails (5.0.5)
94
+ actioncable (= 5.0.5)
95
+ actionmailer (= 5.0.5)
96
+ actionpack (= 5.0.5)
97
+ actionview (= 5.0.5)
98
+ activejob (= 5.0.5)
99
+ activemodel (= 5.0.5)
100
+ activerecord (= 5.0.5)
101
+ activesupport (= 5.0.5)
102
+ bundler (>= 1.3.0)
103
+ railties (= 5.0.5)
102
104
  sprockets-rails (>= 2.0.0)
103
- rails-dom-testing (2.0.2)
104
- activesupport (>= 4.2.0, < 6.0)
105
- nokogiri (~> 1.6)
105
+ rails-dom-testing (2.0.3)
106
+ activesupport (>= 4.2.0)
107
+ nokogiri (>= 1.6)
106
108
  rails-html-sanitizer (1.0.3)
107
109
  loofah (~> 2.0)
108
- railties (5.0.2)
109
- actionpack (= 5.0.2)
110
- activesupport (= 5.0.2)
110
+ railties (5.0.5)
111
+ actionpack (= 5.0.5)
112
+ activesupport (= 5.0.5)
111
113
  method_source
112
114
  rake (>= 0.8.7)
113
115
  thor (>= 0.18.1, < 2.0)
@@ -128,8 +130,8 @@ GEM
128
130
  diff-lcs (>= 1.2.0, < 2.0)
129
131
  rspec-support (~> 3.4.0)
130
132
  rspec-support (3.4.1)
131
- rufus-scheduler (3.3.4)
132
- tzinfo
133
+ rufus-scheduler (3.4.2)
134
+ et-orbi (~> 1.0)
133
135
  sinatra (2.0.0.beta2)
134
136
  mustermann (= 1.0.0.beta2)
135
137
  rack (~> 2.0)
@@ -151,11 +153,9 @@ GEM
151
153
  actionpack (>= 4.0)
152
154
  activesupport (>= 4.0)
153
155
  sprockets (>= 3.0.0)
154
- test_after_commit (0.4.1)
155
- activerecord (>= 3.2)
156
156
  thor (0.19.4)
157
157
  thread_safe (0.3.6)
158
- tilt (2.0.7)
158
+ tilt (2.0.8)
159
159
  timecop (0.7.1)
160
160
  tzinfo (1.2.3)
161
161
  thread_safe (~> 0.1)
@@ -170,7 +170,7 @@ PLATFORMS
170
170
  DEPENDENCIES
171
171
  bump
172
172
  byebug
173
- database_cleaner (= 1.3.0)
173
+ database_cleaner (= 1.6.1)
174
174
  inst-jobs!
175
175
  pg
176
176
  pry
@@ -180,9 +180,8 @@ DEPENDENCIES
180
180
  rspec (= 3.4.0)
181
181
  sinatra (= 2.0.0.beta2)
182
182
  sinatra-contrib (= 2.0.0.beta2)
183
- test_after_commit (= 0.4.1)
184
183
  timecop (= 0.7.1)
185
184
  wwtd (~> 1.3.0)
186
185
 
187
186
  BUNDLED WITH
188
- 1.14.6
187
+ 1.15.3
@@ -0,0 +1,187 @@
1
+ PATH
2
+ remote: ../..
3
+ specs:
4
+ inst-jobs (0.13.3)
5
+ after_transaction_commit (~> 1.0)
6
+ rails (>= 4.2)
7
+ redis (> 3.0)
8
+ redis-scripting (~> 1.0.1)
9
+ rufus-scheduler (~> 3.4)
10
+
11
+ GEM
12
+ remote: https://rubygems.org/
13
+ specs:
14
+ actioncable (5.1.1)
15
+ actionpack (= 5.1.1)
16
+ nio4r (~> 2.0)
17
+ websocket-driver (~> 0.6.1)
18
+ actionmailer (5.1.1)
19
+ actionpack (= 5.1.1)
20
+ actionview (= 5.1.1)
21
+ activejob (= 5.1.1)
22
+ mail (~> 2.5, >= 2.5.4)
23
+ rails-dom-testing (~> 2.0)
24
+ actionpack (5.1.1)
25
+ actionview (= 5.1.1)
26
+ activesupport (= 5.1.1)
27
+ rack (~> 2.0)
28
+ rack-test (~> 0.6.3)
29
+ rails-dom-testing (~> 2.0)
30
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
31
+ actionview (5.1.1)
32
+ activesupport (= 5.1.1)
33
+ builder (~> 3.1)
34
+ erubi (~> 1.4)
35
+ rails-dom-testing (~> 2.0)
36
+ rails-html-sanitizer (~> 1.0, >= 1.0.3)
37
+ activejob (5.1.1)
38
+ activesupport (= 5.1.1)
39
+ globalid (>= 0.3.6)
40
+ activemodel (5.1.1)
41
+ activesupport (= 5.1.1)
42
+ activerecord (5.1.1)
43
+ activemodel (= 5.1.1)
44
+ activesupport (= 5.1.1)
45
+ arel (~> 8.0)
46
+ activesupport (5.1.1)
47
+ concurrent-ruby (~> 1.0, >= 1.0.2)
48
+ i18n (~> 0.7)
49
+ minitest (~> 5.1)
50
+ tzinfo (~> 1.1)
51
+ after_transaction_commit (1.1.2)
52
+ activerecord (>= 4.0)
53
+ arel (8.0.0)
54
+ backports (3.7.0)
55
+ builder (3.2.3)
56
+ bump (0.5.3)
57
+ byebug (9.0.6)
58
+ coderay (1.1.1)
59
+ concurrent-ruby (1.0.5)
60
+ database_cleaner (1.6.1)
61
+ diff-lcs (1.3)
62
+ erubi (1.6.0)
63
+ et-orbi (1.0.3)
64
+ tzinfo
65
+ globalid (0.4.0)
66
+ activesupport (>= 4.2.0)
67
+ i18n (0.8.4)
68
+ loofah (2.0.3)
69
+ nokogiri (>= 1.5.9)
70
+ mail (2.6.6)
71
+ mime-types (>= 1.16, < 4)
72
+ method_source (0.8.2)
73
+ mime-types (3.1)
74
+ mime-types-data (~> 3.2015)
75
+ mime-types-data (3.2016.0521)
76
+ mini_portile2 (2.2.0)
77
+ minitest (5.10.2)
78
+ multi_json (1.12.1)
79
+ mustermann (1.0.0.beta2)
80
+ nio4r (2.1.0)
81
+ nokogiri (1.8.0)
82
+ mini_portile2 (~> 2.2.0)
83
+ pg (0.21.0)
84
+ pry (0.10.4)
85
+ coderay (~> 1.1.0)
86
+ method_source (~> 0.8.1)
87
+ slop (~> 3.4)
88
+ rack (2.0.3)
89
+ rack-protection (2.0.0.beta2)
90
+ rack
91
+ rack-test (0.6.3)
92
+ rack (>= 1.0)
93
+ rails (5.1.1)
94
+ actioncable (= 5.1.1)
95
+ actionmailer (= 5.1.1)
96
+ actionpack (= 5.1.1)
97
+ actionview (= 5.1.1)
98
+ activejob (= 5.1.1)
99
+ activemodel (= 5.1.1)
100
+ activerecord (= 5.1.1)
101
+ activesupport (= 5.1.1)
102
+ bundler (>= 1.3.0, < 2.0)
103
+ railties (= 5.1.1)
104
+ sprockets-rails (>= 2.0.0)
105
+ rails-dom-testing (2.0.3)
106
+ activesupport (>= 4.2.0)
107
+ nokogiri (>= 1.6)
108
+ rails-html-sanitizer (1.0.3)
109
+ loofah (~> 2.0)
110
+ railties (5.1.1)
111
+ actionpack (= 5.1.1)
112
+ activesupport (= 5.1.1)
113
+ method_source
114
+ rake (>= 0.8.7)
115
+ thor (>= 0.18.1, < 2.0)
116
+ rake (12.0.0)
117
+ redis (3.3.3)
118
+ redis-scripting (1.0.1)
119
+ redis (>= 3.0)
120
+ rspec (3.4.0)
121
+ rspec-core (~> 3.4.0)
122
+ rspec-expectations (~> 3.4.0)
123
+ rspec-mocks (~> 3.4.0)
124
+ rspec-core (3.4.4)
125
+ rspec-support (~> 3.4.0)
126
+ rspec-expectations (3.4.0)
127
+ diff-lcs (>= 1.2.0, < 2.0)
128
+ rspec-support (~> 3.4.0)
129
+ rspec-mocks (3.4.1)
130
+ diff-lcs (>= 1.2.0, < 2.0)
131
+ rspec-support (~> 3.4.0)
132
+ rspec-support (3.4.1)
133
+ rufus-scheduler (3.4.0)
134
+ et-orbi (~> 1.0)
135
+ sinatra (2.0.0.beta2)
136
+ mustermann (= 1.0.0.beta2)
137
+ rack (~> 2.0)
138
+ rack-protection (= 2.0.0.beta2)
139
+ tilt (~> 2.0)
140
+ sinatra-contrib (2.0.0.beta2)
141
+ backports (>= 2.0)
142
+ multi_json
143
+ mustermann (= 1.0.0.beta2)
144
+ rack-protection (= 2.0.0.beta2)
145
+ rack-test
146
+ sinatra (= 2.0.0.beta2)
147
+ tilt (>= 1.3, < 3)
148
+ slop (3.6.0)
149
+ sprockets (3.7.1)
150
+ concurrent-ruby (~> 1.0)
151
+ rack (> 1, < 3)
152
+ sprockets-rails (3.2.0)
153
+ actionpack (>= 4.0)
154
+ activesupport (>= 4.0)
155
+ sprockets (>= 3.0.0)
156
+ thor (0.19.4)
157
+ thread_safe (0.3.6)
158
+ tilt (2.0.7)
159
+ timecop (0.7.1)
160
+ tzinfo (1.2.3)
161
+ thread_safe (~> 0.1)
162
+ websocket-driver (0.6.5)
163
+ websocket-extensions (>= 0.1.0)
164
+ websocket-extensions (0.1.2)
165
+ wwtd (1.3.0)
166
+
167
+ PLATFORMS
168
+ ruby
169
+
170
+ DEPENDENCIES
171
+ bump
172
+ byebug
173
+ database_cleaner (= 1.6.1)
174
+ inst-jobs!
175
+ pg
176
+ pry
177
+ rack-test
178
+ rails (~> 5.1.0)
179
+ rake
180
+ rspec (= 3.4.0)
181
+ sinatra (= 2.0.0.beta2)
182
+ sinatra-contrib (= 2.0.0.beta2)
183
+ timecop (= 0.7.1)
184
+ wwtd (~> 1.3.0)
185
+
186
+ BUNDLED WITH
187
+ 1.14.6
@@ -373,7 +373,6 @@ shared_examples_for 'Delayed::Worker' do
373
373
  describe "#start" do
374
374
  it "fires off an execute callback on the processing jobs loop" do
375
375
  fired = false
376
- expect(@worker).to receive(:run)
377
376
  expect(@worker).to receive(:exit?).and_return(true)
378
377
  Delayed::Worker.lifecycle.before(:execute) { |w| w == @worker && fired = true }
379
378
  @worker.start
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inst-jobs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.7
4
+ version: 0.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tobias Luetke
8
8
  - Brian Palmer
9
9
  autorequire:
10
- bindir: bin
10
+ bindir: exe
11
11
  cert_chain: []
12
- date: 2017-08-30 00:00:00.000000000 Z
12
+ date: 2017-09-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: after_transaction_commit
@@ -263,7 +263,6 @@ executables:
263
263
  extensions: []
264
264
  extra_rdoc_files: []
265
265
  files:
266
- - bin/inst_jobs
267
266
  - db/migrate/20101216224513_create_delayed_jobs.rb
268
267
  - db/migrate/20110208031356_add_delayed_jobs_tag.rb
269
268
  - db/migrate/20110426161613_add_delayed_jobs_max_attempts.rb
@@ -285,6 +284,7 @@ files:
285
284
  - db/migrate/20151123210429_add_expires_at_to_jobs.rb
286
285
  - db/migrate/20151210162949_improve_max_concurrent.rb
287
286
  - db/migrate/20161206323555_add_back_default_string_limits_jobs.rb
287
+ - exe/inst_jobs
288
288
  - lib/delayed/backend/active_record.rb
289
289
  - lib/delayed/backend/base.rb
290
290
  - lib/delayed/backend/redis/bulk_update.lua
@@ -343,6 +343,7 @@ files:
343
343
  - spec/gemfiles/50.gemfile
344
344
  - spec/gemfiles/50.gemfile.lock
345
345
  - spec/gemfiles/51.gemfile
346
+ - spec/gemfiles/51.gemfile.lock
346
347
  - spec/migrate/20140924140513_add_story_table.rb
347
348
  - spec/redis_job_spec.rb
348
349
  - spec/sample_jobs.rb
@@ -373,7 +374,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
373
374
  version: '0'
374
375
  requirements: []
375
376
  rubyforge_project:
376
- rubygems_version: 2.6.11
377
+ rubygems_version: 2.6.13
377
378
  signing_key:
378
379
  specification_version: 4
379
380
  summary: Instructure-maintained fork of delayed_job
@@ -393,6 +394,7 @@ test_files:
393
394
  - spec/gemfiles/50.gemfile
394
395
  - spec/gemfiles/50.gemfile.lock
395
396
  - spec/gemfiles/51.gemfile
397
+ - spec/gemfiles/51.gemfile.lock
396
398
  - spec/migrate/20140924140513_add_story_table.rb
397
399
  - spec/redis_job_spec.rb
398
400
  - spec/sample_jobs.rb