workhorse 0.3.3 → 0.3.4

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
- SHA1:
3
- metadata.gz: c1be39da6073815c572723439313acb43f8dfb84
4
- data.tar.gz: 76093dbfede4a6ff6df3cf65437fa3898371918d
2
+ SHA256:
3
+ metadata.gz: e6cda82b0f03df2130e38841bff942ab7f3d559a1c6233121c6060a7c06d50d0
4
+ data.tar.gz: 64b0c6ba8e659ff3dcc4009b5c13ba91139e7f82a6043f42c0d3eed6c0368107
5
5
  SHA512:
6
- metadata.gz: 75f5b82d38db45cf9589722faede509202b3273ca025e0d7aacc41120fe0ed171915fc035fcc3111463b08cd1b19b066ffed1209f1a45cbc7fdcfa9d811931bb
7
- data.tar.gz: f9cfb313c78592a9a05ad6b72eec42500869d653ab048175c3d892dbb58c47584f06500504ab43a76dd4edcc01133c6b2876e007a376db64256a194fb41dc1d9
6
+ metadata.gz: '0998ffd89b16233c8fa97fa00b8db4de490f9dccdebc7a6002a5d44a0ac859a050a41e339c545f6ec5ebfaa9888671b693cf389a779975c214b54cd9328385d4'
7
+ data.tar.gz: 9b2d2d1fc6e3d2667286c9a5f48a247596612a9b0162b4cc202b536f43745a55894d35f45e2efd5badf431cbaea0a47f9108262d1d24252bf4410222d7eb58e5
data/CHANGELOG.md CHANGED
@@ -1,6 +1,15 @@
1
1
  # Workhorse Change log
2
2
 
3
- ## 0.3.3 - 2018-02-23
3
+ ## 0.3.4 - 2018-09-24
4
+
5
+ * *Fixes #14
6
+
7
+ * Fixes crucial bug where multiple jobs of the same queue could be executed
8
+ simultaneously.
9
+
10
+ * Makes `Workhorse::DbJob` attributes accessible for earlier versions of rails.
11
+
12
+ ## 0.3.3 - 2018-02-26
4
13
 
5
14
  * Adds missing require for `concurrent` library that is required in some
6
15
  versions of Rails
data/FAQ.md CHANGED
@@ -75,3 +75,7 @@ production mode.
75
75
  ## Why does workhorse not support timeouts?
76
76
 
77
77
  Generic timeout implementations are [a dangerous thing](http://www.mikeperham.com/2015/05/08/timeout-rubys-most-dangerous-api/) in Ruby. This is why we decided against providing this feature in Workhorse and recommend to implement the timeouts inside of your jobs - i.e. via network timeouts.
78
+
79
+ ## Why is workhorse not integrated into Rails per default?
80
+
81
+ We have submitted [a pull request](https://github.com/rails/rails/pull/31504) to Rails, but they stated that they won't add any new adapters to Rails. There are plans to integrate this on the Gem side only - stay tuned.
data/Rakefile CHANGED
@@ -15,7 +15,7 @@ task :gemspec do
15
15
  spec.add_development_dependency 'rake'
16
16
  spec.add_development_dependency 'rubocop', '0.51.0'
17
17
  spec.add_development_dependency 'minitest'
18
- spec.add_development_dependency 'mysql2', '~> 0.3.13'
18
+ spec.add_development_dependency 'mysql2'
19
19
  spec.add_development_dependency 'benchmark-ips'
20
20
  spec.add_dependency 'activesupport'
21
21
  spec.add_dependency 'activerecord'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.3
1
+ 0.3.4
@@ -8,6 +8,8 @@ module Workhorse
8
8
 
9
9
  fail 'Count must be an integer > 0.' unless count.is_a?(Integer) && count > 0
10
10
 
11
+ FileUtils.mkdir_p('tmp/pids')
12
+
11
13
  if @pidfile.nil?
12
14
  @pidfile = count > 1 ? 'tmp/pids/workhorse.%i.pid' : 'tmp/pids/workhorse.pid'
13
15
  elsif @count > 1 && !@pidfile.include?('%s')
@@ -6,6 +6,10 @@ module Workhorse
6
6
  STATE_SUCCEEDED = :succeeded
7
7
  STATE_FAILED = :failed
8
8
 
9
+ if respond_to?(:attr_accessible)
10
+ attr_accessible :queue, :priority, :perform_at, :handler
11
+ end
12
+
9
13
  self.table_name = 'jobs'
10
14
 
11
15
  def mark_locked!(worker_id)
@@ -88,7 +88,7 @@ module Workhorse
88
88
  # ---------------------------------------------------------------
89
89
  # Select jobs to execute
90
90
  # ---------------------------------------------------------------
91
- #
91
+
92
92
  # Construct selects for each queue which then are UNIONed for the final
93
93
  # set. This is required because we only want the first job of each queue
94
94
  # to be posted.
@@ -188,8 +188,9 @@ module Workhorse
188
188
  select = valid_ordered_select
189
189
 
190
190
  # Restrict queues that are currently in progress
191
+ bad_states = [Workhorse::DbJob::STATE_LOCKED, Workhorse::DbJob::STATE_STARTED]
191
192
  bad_queries_select = table.project(table[:queue])
192
- .where(table[:state].in(%i[locked running]))
193
+ .where(table[:state].in(bad_states))
193
194
  # .distinct is not chainable in older Arel versions
194
195
  bad_queries_select.distinct
195
196
  select = select.where(table[:queue].not_in(bad_queries_select))
@@ -9,6 +9,7 @@ module Workhorse
9
9
  attr_reader :polling_interval
10
10
  attr_reader :mutex
11
11
  attr_reader :logger
12
+ attr_reader :poller
12
13
 
13
14
  # Instantiates and starts a new worker with the given arguments and then
14
15
  # waits for its completion (i.e. an interrupt).
@@ -10,4 +10,41 @@ class Workhorse::PollerTest < WorkhorseTest
10
10
  w.shutdown
11
11
  end
12
12
  end
13
+
14
+ def test_valid_queues
15
+ w = Workhorse::Worker.new(polling_interval: 60)
16
+
17
+ Workhorse.enqueue BasicJob.new(sleep_time: 2), queue: :q1
18
+ Workhorse.enqueue BasicJob.new(sleep_time: 2), queue: :q1
19
+ Workhorse.enqueue BasicJob.new(sleep_time: 2), queue: :q2
20
+ Workhorse.enqueue BasicJob.new(sleep_time: 2), queue: :q2
21
+
22
+ assert_equal %w[q1 q2], w.poller.send(:valid_queues)
23
+
24
+ first_job = Workhorse::DbJob.first
25
+ first_job.mark_locked!(42)
26
+
27
+ assert_equal %w[q2], w.poller.send(:valid_queues)
28
+
29
+ first_job.mark_started!
30
+
31
+ assert_equal %w[q2], w.poller.send(:valid_queues)
32
+
33
+ first_job.mark_succeeded!
34
+
35
+ assert_equal %w[q1 q2], w.poller.send(:valid_queues)
36
+
37
+ last_job = Workhorse::DbJob.last
38
+ last_job.mark_locked!(42)
39
+
40
+ assert_equal %w[q1], w.poller.send(:valid_queues)
41
+
42
+ begin
43
+ fail 'Some exception'
44
+ rescue => e
45
+ last_job.mark_failed!(e)
46
+ end
47
+
48
+ assert_equal %w[q1 q2], w.poller.send(:valid_queues)
49
+ end
13
50
  end
@@ -109,6 +109,17 @@ class Workhorse::WorkerTest < WorkhorseTest
109
109
  assert_equal 'succeeded', jobs[2].state
110
110
  end
111
111
 
112
+ def test_queue_not_parallel
113
+ Workhorse::DbJob.delete_all
114
+ Workhorse.enqueue BasicJob.new(sleep_time: 0.2), queue: :q1
115
+ Workhorse.enqueue BasicJob.new(sleep_time: 0.2), queue: :q1
116
+
117
+ work 0.2, polling_interval: 0.2
118
+ jobs = Workhorse::DbJob.all.to_a
119
+ assert_equal 'succeeded', jobs[0].state
120
+ assert_equal 'waiting', jobs[1].state
121
+ end
122
+
112
123
  def test_multiple_queued_same_queue
113
124
  # One queue
114
125
  Workhorse.enqueue BasicJob.new(sleep_time: 0.2), queue: :q1
data/workhorse.gemspec CHANGED
@@ -1,16 +1,16 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: workhorse 0.3.3 ruby lib
2
+ # stub: workhorse 0.3.4 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "workhorse".freeze
6
- s.version = "0.3.3"
6
+ s.version = "0.3.4"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
10
10
  s.authors = ["Sitrox".freeze]
11
- s.date = "2018-02-26"
11
+ s.date = "2018-09-24"
12
12
  s.files = [".gitignore".freeze, ".releaser_config".freeze, ".rubocop.yml".freeze, ".travis.yml".freeze, "CHANGELOG.md".freeze, "FAQ.md".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "RUBY_VERSION".freeze, "Rakefile".freeze, "VERSION".freeze, "bin/rubocop".freeze, "lib/generators/workhorse/install_generator.rb".freeze, "lib/generators/workhorse/templates/bin/workhorse.rb".freeze, "lib/generators/workhorse/templates/config/initializers/workhorse.rb".freeze, "lib/generators/workhorse/templates/create_table_jobs.rb".freeze, "lib/workhorse.rb".freeze, "lib/workhorse/daemon.rb".freeze, "lib/workhorse/daemon/shell_handler.rb".freeze, "lib/workhorse/db_job.rb".freeze, "lib/workhorse/enqueuer.rb".freeze, "lib/workhorse/jobs/cleanup_succeeded_jobs.rb".freeze, "lib/workhorse/jobs/run_rails_op.rb".freeze, "lib/workhorse/performer.rb".freeze, "lib/workhorse/poller.rb".freeze, "lib/workhorse/pool.rb".freeze, "lib/workhorse/worker.rb".freeze, "test/lib/db_schema.rb".freeze, "test/lib/jobs.rb".freeze, "test/lib/test_helper.rb".freeze, "test/workhorse/enqueuer_test.rb".freeze, "test/workhorse/performer_test.rb".freeze, "test/workhorse/poller_test.rb".freeze, "test/workhorse/pool_test.rb".freeze, "test/workhorse/worker_test.rb".freeze, "workhorse.gemspec".freeze]
13
- s.rubygems_version = "2.6.14".freeze
13
+ s.rubygems_version = "2.5.2.3".freeze
14
14
  s.summary = "Multi-threaded job backend with database queuing for ruby.".freeze
15
15
  s.test_files = ["test/lib/db_schema.rb".freeze, "test/lib/jobs.rb".freeze, "test/lib/test_helper.rb".freeze, "test/workhorse/enqueuer_test.rb".freeze, "test/workhorse/performer_test.rb".freeze, "test/workhorse/poller_test.rb".freeze, "test/workhorse/pool_test.rb".freeze, "test/workhorse/worker_test.rb".freeze]
16
16
 
@@ -22,7 +22,7 @@ Gem::Specification.new do |s|
22
22
  s.add_development_dependency(%q<rake>.freeze, [">= 0"])
23
23
  s.add_development_dependency(%q<rubocop>.freeze, ["= 0.51.0"])
24
24
  s.add_development_dependency(%q<minitest>.freeze, [">= 0"])
25
- s.add_development_dependency(%q<mysql2>.freeze, ["~> 0.3.13"])
25
+ s.add_development_dependency(%q<mysql2>.freeze, [">= 0"])
26
26
  s.add_development_dependency(%q<benchmark-ips>.freeze, [">= 0"])
27
27
  s.add_runtime_dependency(%q<activesupport>.freeze, [">= 0"])
28
28
  s.add_runtime_dependency(%q<activerecord>.freeze, [">= 0"])
@@ -33,7 +33,7 @@ Gem::Specification.new do |s|
33
33
  s.add_dependency(%q<rake>.freeze, [">= 0"])
34
34
  s.add_dependency(%q<rubocop>.freeze, ["= 0.51.0"])
35
35
  s.add_dependency(%q<minitest>.freeze, [">= 0"])
36
- s.add_dependency(%q<mysql2>.freeze, ["~> 0.3.13"])
36
+ s.add_dependency(%q<mysql2>.freeze, [">= 0"])
37
37
  s.add_dependency(%q<benchmark-ips>.freeze, [">= 0"])
38
38
  s.add_dependency(%q<activesupport>.freeze, [">= 0"])
39
39
  s.add_dependency(%q<activerecord>.freeze, [">= 0"])
@@ -45,7 +45,7 @@ Gem::Specification.new do |s|
45
45
  s.add_dependency(%q<rake>.freeze, [">= 0"])
46
46
  s.add_dependency(%q<rubocop>.freeze, ["= 0.51.0"])
47
47
  s.add_dependency(%q<minitest>.freeze, [">= 0"])
48
- s.add_dependency(%q<mysql2>.freeze, ["~> 0.3.13"])
48
+ s.add_dependency(%q<mysql2>.freeze, [">= 0"])
49
49
  s.add_dependency(%q<benchmark-ips>.freeze, [">= 0"])
50
50
  s.add_dependency(%q<activesupport>.freeze, [">= 0"])
51
51
  s.add_dependency(%q<activerecord>.freeze, [">= 0"])
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: workhorse
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sitrox
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-26 00:00:00.000000000 Z
11
+ date: 2018-09-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -70,16 +70,16 @@ dependencies:
70
70
  name: mysql2
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: 0.3.13
75
+ version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: 0.3.13
82
+ version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: benchmark-ips
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -212,7 +212,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
212
212
  version: '0'
213
213
  requirements: []
214
214
  rubyforge_project:
215
- rubygems_version: 2.6.14
215
+ rubygems_version: 2.7.6
216
216
  signing_key:
217
217
  specification_version: 4
218
218
  summary: Multi-threaded job backend with database queuing for ruby.