workhorse 1.5.1 → 1.5.2
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/ruby.yml +4 -0
- data/CHANGELOG.md +16 -0
- data/Gemfile +1 -0
- data/VERSION +1 -1
- data/lib/workhorse/poller.rb +6 -1
- data/test/lib/test_helper.rb +30 -3
- data/test/workhorse/poller_test.rb +15 -0
- data/workhorse.gemspec +3 -3
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9ffbb2c24919d7b745fd87bd6a8675fdae5448a6c0e11c3af486d34baf5a9343
|
|
4
|
+
data.tar.gz: 9cf2270f0c3a65d244d679baf56367033e314e4a8b7ed11cc17f4d07e4a6fe63
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 22b02451a64ae383b75616b9556cc05927f479f47db7d7993347df0f520d36ebfda8c7f3f4de49574c84499dfd603285bab83295df72c6100b0f6f438730d576
|
|
7
|
+
data.tar.gz: '0549ab8a2e2683dd13b60bc85a5d2d85a260dee938a13714c45fe1233af217a433af2e71f899a7056c3afd8f503f6f94e1a5b9cee5e97bbf5fb93fed9ae75a03'
|
data/.github/workflows/ruby.yml
CHANGED
|
@@ -16,11 +16,15 @@ jobs:
|
|
|
16
16
|
- '3.0.1'
|
|
17
17
|
- '3.1.2'
|
|
18
18
|
- '3.2.1'
|
|
19
|
+
db-adapter:
|
|
20
|
+
- 'mysql2'
|
|
21
|
+
- 'trilogy'
|
|
19
22
|
env:
|
|
20
23
|
DB_DATABASE: workhorse
|
|
21
24
|
DB_USER: root
|
|
22
25
|
DB_PASSWORD: 'root'
|
|
23
26
|
DB_HOST: localhost
|
|
27
|
+
DB_ADAPTER: ${{ matrix.db-adapter }}
|
|
24
28
|
|
|
25
29
|
steps:
|
|
26
30
|
- uses: actions/checkout@v2
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Workhorse Changelog
|
|
2
2
|
|
|
3
|
+
## 1.5.2 - 2026-08-04
|
|
4
|
+
|
|
5
|
+
* Fix `Poller#valid_queues` raising `NoMethodError` on the Oracle adapter. The
|
|
6
|
+
`activerecord-oracle_enhanced-adapter` returns `true` from `#execute` instead
|
|
7
|
+
of a result set, so the subsequent `.to_a` call failed with
|
|
8
|
+
`undefined method 'to_a' for true`. Switched to `#select_values`, which is
|
|
9
|
+
implemented in terms of `#exec_query` and therefore returns the queue names on
|
|
10
|
+
the `mysql2`, `trilogy` and `oracle_enhanced` adapters alike (the latter both
|
|
11
|
+
before and after version 7.0.0).
|
|
12
|
+
|
|
13
|
+
Sitrox reference: #152178.
|
|
14
|
+
|
|
15
|
+
* Run the test suite against both the `mysql2` and the `trilogy` adapter. The
|
|
16
|
+
adapter can be selected using the `DB_ADAPTER` environment variable and
|
|
17
|
+
defaults to `mysql2`.
|
|
18
|
+
|
|
3
19
|
## 1.5.1 - 2026-07-22
|
|
4
20
|
|
|
5
21
|
* Add per-worker heartbeat files. On every successful poll, each worker touches
|
data/Gemfile
CHANGED
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.5.
|
|
1
|
+
1.5.2
|
data/lib/workhorse/poller.rb
CHANGED
|
@@ -452,7 +452,12 @@ module Workhorse
|
|
|
452
452
|
select.projections = []
|
|
453
453
|
queues = select.project(:queue)
|
|
454
454
|
|
|
455
|
-
|
|
455
|
+
# Note that `select_values` is used here on purpose: `execute` does not
|
|
456
|
+
# return a result set on every adapter (the Oracle enhanced adapter, for
|
|
457
|
+
# instance, returns `true` for queries), while `select_values` is
|
|
458
|
+
# implemented in terms of `exec_query` and thus behaves the same on the
|
|
459
|
+
# mysql2, trilogy and Oracle enhanced adapters.
|
|
460
|
+
return Workhorse::DbJob.connection.select_values(queues.distinct.to_sql)
|
|
456
461
|
end
|
|
457
462
|
end
|
|
458
463
|
end
|
data/test/lib/test_helper.rb
CHANGED
|
@@ -2,11 +2,23 @@ require 'minitest/autorun'
|
|
|
2
2
|
require 'active_record'
|
|
3
3
|
require 'active_job'
|
|
4
4
|
require 'pry'
|
|
5
|
-
require 'mysql2'
|
|
6
5
|
require 'benchmark'
|
|
7
6
|
require 'concurrent'
|
|
8
7
|
require 'jobs'
|
|
9
8
|
|
|
9
|
+
# The adapter to run the test suite against. Both MySQL / MariaDB adapters are
|
|
10
|
+
# supported, as workhorse has to work with either of them.
|
|
11
|
+
DB_ADAPTER = ENV.fetch('DB_ADAPTER', 'mysql2')
|
|
12
|
+
|
|
13
|
+
case DB_ADAPTER
|
|
14
|
+
when 'mysql2'
|
|
15
|
+
require 'mysql2'
|
|
16
|
+
when 'trilogy'
|
|
17
|
+
require 'trilogy'
|
|
18
|
+
else
|
|
19
|
+
fail "Unsupported DB_ADAPTER #{DB_ADAPTER.inspect}, use 'mysql2' or 'trilogy'."
|
|
20
|
+
end
|
|
21
|
+
|
|
10
22
|
class MockRailsEnv < String
|
|
11
23
|
def production?
|
|
12
24
|
self == 'production'
|
|
@@ -43,10 +55,25 @@ class WorkhorseTest < ActiveSupport::TestCase
|
|
|
43
55
|
|
|
44
56
|
attr_reader :daemon
|
|
45
57
|
|
|
58
|
+
# Temporarily replaces the method `method` on `object` with one that always
|
|
59
|
+
# returns `value`, for the duration of the given block.
|
|
60
|
+
#
|
|
61
|
+
# This is implemented by hand rather than using minitest's `stub`, as
|
|
62
|
+
# `minitest/mock` is not available in every minitest version this gem is
|
|
63
|
+
# tested against.
|
|
64
|
+
def with_return_value(object, method, value)
|
|
65
|
+
object.define_singleton_method(method) { |*, **| value }
|
|
66
|
+
yield
|
|
67
|
+
ensure
|
|
68
|
+
object.singleton_class.send(:remove_method, method)
|
|
69
|
+
end
|
|
70
|
+
|
|
46
71
|
def clear_locks_and_db_threads!
|
|
47
72
|
Workhorse::DbJob.connection.execute('SELECT RELEASE_ALL_LOCKS()')
|
|
48
73
|
|
|
49
|
-
|
|
74
|
+
# Use `select_values` rather than `execute`, as the latter does not return a
|
|
75
|
+
# result set on every adapter.
|
|
76
|
+
pids = Workhorse::DbJob.connection.select_values(<<~SQL.squish)
|
|
50
77
|
SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID != CONNECTION_ID()
|
|
51
78
|
SQL
|
|
52
79
|
|
|
@@ -179,7 +206,7 @@ class WorkhorseTest < ActiveSupport::TestCase
|
|
|
179
206
|
end
|
|
180
207
|
|
|
181
208
|
ActiveRecord::Base.establish_connection(
|
|
182
|
-
adapter:
|
|
209
|
+
adapter: DB_ADAPTER,
|
|
183
210
|
database: ENV.fetch('DB_NAME', nil) || 'workhorse',
|
|
184
211
|
username: ENV.fetch('DB_USERNAME', nil) || 'root',
|
|
185
212
|
password: ENV.fetch('DB_PASSWORD', nil) || '',
|
|
@@ -71,6 +71,21 @@ class Workhorse::PollerTest < WorkhorseTest
|
|
|
71
71
|
assert_equal [], w.poller.send(:valid_queues)
|
|
72
72
|
end
|
|
73
73
|
|
|
74
|
+
# Not every adapter returns a result set from `execute`: the Oracle enhanced
|
|
75
|
+
# adapter, for instance, returns `true` for queries, both before and after
|
|
76
|
+
# version 7.0.0. Querying the valid queues must therefore not rely on the
|
|
77
|
+
# return value of `execute`.
|
|
78
|
+
def test_valid_queues_without_usable_execute
|
|
79
|
+
w = Workhorse::Worker.new(polling_interval: 60)
|
|
80
|
+
|
|
81
|
+
Workhorse.enqueue BasicJob.new(sleep_time: 2), queue: nil
|
|
82
|
+
Workhorse.enqueue BasicJob.new(sleep_time: 2), queue: :a
|
|
83
|
+
|
|
84
|
+
with_return_value(Workhorse::DbJob.connection, :execute, true) do
|
|
85
|
+
assert_equal [nil, 'a'], w.poller.send(:valid_queues)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
74
89
|
def test_nil_queues
|
|
75
90
|
w = Workhorse::Worker.new(pool_size: 2, polling_interval: 60)
|
|
76
91
|
|
data/workhorse.gemspec
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
|
2
|
-
# stub: workhorse 1.5.
|
|
2
|
+
# stub: workhorse 1.5.2 ruby lib
|
|
3
3
|
|
|
4
4
|
Gem::Specification.new do |s|
|
|
5
5
|
s.name = "workhorse".freeze
|
|
6
|
-
s.version = "1.5.
|
|
6
|
+
s.version = "1.5.2".freeze
|
|
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 = "2026-
|
|
11
|
+
s.date = "2026-08-04"
|
|
12
12
|
s.files = [".github/workflows/ruby.yml".freeze, ".gitignore".freeze, ".releaser_config".freeze, ".rubocop.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/active_job/queue_adapters/workhorse_adapter.rb".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/active_job_extension.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/detect_stale_jobs_job.rb".freeze, "lib/workhorse/jobs/run_active_job.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/scoped_env.rb".freeze, "lib/workhorse/worker.rb".freeze, "test/active_job/queue_adapters/workhorse_adapter_test.rb".freeze, "test/lib/db_schema.rb".freeze, "test/lib/jobs.rb".freeze, "test/lib/test_helper.rb".freeze, "test/workhorse/daemon_test.rb".freeze, "test/workhorse/db_job_test.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, "test/workhorse/yjit_test.rb".freeze, "workhorse.gemspec".freeze]
|
|
13
13
|
s.homepage = "https://github.com/sitrox/workhorse".freeze
|
|
14
14
|
s.licenses = ["MIT".freeze]
|
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: workhorse
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.5.
|
|
4
|
+
version: 1.5.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Sitrox
|
|
8
8
|
bindir: bin
|
|
9
9
|
cert_chain: []
|
|
10
|
-
date: 2026-
|
|
10
|
+
date: 2026-08-04 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
12
12
|
- !ruby/object:Gem::Dependency
|
|
13
13
|
name: activesupport
|