chore-core 1.8.2 → 1.8.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f1a706f2f8f8eefe36f16cfaea8636f6fe13df8d
4
- data.tar.gz: d4c0b0f97c85916e509ec609bd9a9e38cac6aac0
3
+ metadata.gz: 8a1e15581a9bd8310bd8d1f4ae4392f35df44afd
4
+ data.tar.gz: 72776fab3cc9fc4013c9c0a80f55dddb2bef7277
5
5
  SHA512:
6
- metadata.gz: c92dcbc42098e17b5e1d3ac05860ca1b74022725a2839964f6480bc8c3f080555e950757997ad9d3d4cdbd4b122e02e467614bb481a4108dfe65c5a74b797c6c
7
- data.tar.gz: 95baf93fe723268b499447c24464443e3e7e19ed62d5718394c7dae66bcafb44a33f47133b3973827efd5856acc4fee2aab795adc33515c18068807f9e5039aa
6
+ metadata.gz: 4b3f27a13ae37b90e18b693bffe1d09f36ab9cdf33ca1ce0a0d9d69fb9c9a1d60836f54ed963549ec6103c59f02e8a95e824b40397489c8ec44c042000e856be
7
+ data.tar.gz: 4beb0d44d569c8eaea6306cd5bab3dd0f89f2ddd59892aa6b3ab5dc9c4f17107eb6fbaa6fab45530ba2c7e87b7eede5737f41d9f2727df6238de9a10998166f7
@@ -10,7 +10,10 @@ module Chore
10
10
  def initialize(manager, opts={})
11
11
  @options = opts
12
12
  @manager = manager
13
+ @stopped = false
13
14
  @worker = nil
15
+ @queue = Queue.new
16
+ @queue << :worker
14
17
  end
15
18
 
16
19
  # Starts the <tt>SingleWorkerStrategy</tt>. Currently a noop
@@ -18,6 +21,11 @@ module Chore
18
21
 
19
22
  # Stops the <tt>SingleWorkerStrategy</tt> if there is a worker to stop
20
23
  def stop!
24
+ return if @stopped
25
+
26
+ @stopped = true
27
+ Chore.logger.info { "Manager #{Process.pid} stopping" }
28
+
21
29
  worker.stop! if worker
22
30
  end
23
31
 
@@ -25,16 +33,14 @@ module Chore
25
33
  # single worker strategy, this should never be called if the worker is in
26
34
  # progress.
27
35
  def assign(work)
28
- if workers_available?
29
- begin
30
- @worker = worker_klass.new(work, @options)
31
- @worker.start
32
- true
33
- ensure
34
- @worker = nil
35
- end
36
- else
37
- Chore.logger.error { "#{self.class}#assign: single worker is unavailable, but assign has been re-entered: #{caller * "\n"}" }
36
+ return unless acquire_worker
37
+
38
+ begin
39
+ @worker = worker_klass.new(work, @options)
40
+ @worker.start
41
+ true
42
+ ensure
43
+ release_worker
38
44
  end
39
45
  end
40
46
 
@@ -42,9 +48,25 @@ module Chore
42
48
  Worker
43
49
  end
44
50
 
45
- # Returns true if there is currently no worker
46
- def workers_available?
47
- @worker.nil?
51
+ private
52
+
53
+ # Attempts to essentially acquire a lock on a worker. If no workers are
54
+ # available, then this will block until one is.
55
+ def acquire_worker
56
+ result = @queue.pop
57
+
58
+ if @stopped
59
+ # Strategy has stopped since the worker was acquired
60
+ release_worker
61
+ nil
62
+ else
63
+ result
64
+ end
65
+ end
66
+
67
+ # Releases the lock on a worker so that another thread can pick it up.
68
+ def release_worker
69
+ @queue << :worker
48
70
  end
49
71
  end
50
72
  end
data/lib/chore/version.rb CHANGED
@@ -2,7 +2,7 @@ module Chore
2
2
  module Version #:nodoc:
3
3
  MAJOR = 1
4
4
  MINOR = 8
5
- PATCH = 2
5
+ PATCH = 3
6
6
 
7
7
  STRING = [ MAJOR, MINOR, PATCH ].join('.')
8
8
  end
@@ -2,6 +2,8 @@ require 'spec_helper'
2
2
 
3
3
  describe Chore::Strategy::SingleWorkerStrategy do
4
4
  let(:manager) { double('Manager') }
5
+ let(:job_timeout) { 60 }
6
+ let(:job) { Chore::UnitOfWork.new(SecureRandom.uuid, 'test', job_timeout, Chore::Encoder::JsonEncoder.encode(TestJob.job_hash([1,2,"3"])), 0) }
5
7
  subject { described_class.new(manager) }
6
8
 
7
9
  describe '#stop!' do
@@ -31,4 +33,27 @@ describe Chore::Strategy::SingleWorkerStrategy do
31
33
  end
32
34
  end
33
35
 
36
+ describe '#assign' do
37
+ let(:worker) { double('Worker', start: nil) }
38
+
39
+ it 'starts a new worker' do
40
+ expect(Chore::Worker).to receive(:new).with(job, {}).and_return(worker)
41
+ subject.assign(job)
42
+ end
43
+
44
+ it 'can be called multiple times' do
45
+ expect(Chore::Worker).to receive(:new).twice.with(job, {}).and_return(worker)
46
+ 2.times { subject.assign(job) }
47
+ end
48
+
49
+ it 'should release the worker if an exception occurs' do
50
+ allow_any_instance_of(Chore::Worker).to receive(:start).and_raise(ArgumentError)
51
+ expect(subject).to receive(:release_worker)
52
+
53
+ begin
54
+ subject.assign(job)
55
+ rescue ArgumentError
56
+ end
57
+ end
58
+ end
34
59
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chore-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.2
4
+ version: 1.8.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tapjoy