workhorse 1.2.13 → 1.2.15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/README.md +74 -0
- data/VERSION +1 -1
- data/lib/workhorse/active_job_extension.rb +20 -0
- data/lib/workhorse/jobs/run_active_job.rb +6 -0
- data/lib/workhorse/jobs/run_rails_op.rb +4 -0
- data/lib/workhorse/performer.rb +5 -1
- data/lib/workhorse/poller.rb +2 -2
- data/lib/workhorse.rb +1 -0
- data/workhorse.gemspec +4 -4
- metadata +10 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 772b634a73940718f57f2363859977dbc7f20ff4b7c12edada5c4cc499ff5f6c
|
4
|
+
data.tar.gz: 8c44df6872578300e6577155626f851ae1cb9202653f835b4dabbcc70fd78c70
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 751c63f5b1d86238d3e403332972ea0d177ee6c92acab793f3477d9c68f8223d755c633140e2622c2979b404f369327b6e507303f0d2532e1bcb408edf4a02f6
|
7
|
+
data.tar.gz: e5209a6b1472239ce48734eb99d0a1c7cfcd9c20d800c6bb5bb77dff001f84ce7b362b444d0d2d3b0ae2b92b035f75d59484df5dc9d4111c7816ad10aa1b17ef
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
# Workhorse Changelog
|
2
2
|
|
3
|
+
## 1.2.15 - 2023-08-28
|
4
|
+
|
5
|
+
* Add capability to skip transactions for enqueued RailsOps operations.
|
6
|
+
|
7
|
+
## 1.2.14 - 2023-08-23
|
8
|
+
|
9
|
+
* Add documentation for transaction handling.
|
10
|
+
|
11
|
+
* Add support for skipping transactions on a per-job basis
|
12
|
+
|
3
13
|
## 1.2.13 - 2023-02-20
|
4
14
|
|
5
15
|
* Add the `config.max_global_lock_fails` setting (defaults to 10). If a
|
data/README.md
CHANGED
@@ -278,6 +278,80 @@ polling interval.
|
|
278
278
|
This setting is recommended for all setups and may eventually be enabled by
|
279
279
|
default.
|
280
280
|
|
281
|
+
## Transactions
|
282
|
+
|
283
|
+
By default, each job is run in an individual database transaction. An exception
|
284
|
+
to this is when performing ActiveJob jobs using `perform_now`, where no
|
285
|
+
transaction is created.
|
286
|
+
|
287
|
+
### Transaction callback
|
288
|
+
|
289
|
+
By default, transactions are created using `ActiveRecord::Base.transaction { ...
|
290
|
+
}`. You can customize this using the setting `config.tx_callback` in your
|
291
|
+
`config/initializers/workhorse.rb` (see commented out section in the generated
|
292
|
+
configuration file).
|
293
|
+
|
294
|
+
### Turning off transactions
|
295
|
+
|
296
|
+
You can turn off transaction wrapping in the following ways:
|
297
|
+
|
298
|
+
- Globally using the setting `config.perform_jobs_in_tx = false` in your
|
299
|
+
`config/initializers/workhorse.rb`. This is not recommended as running jobs
|
300
|
+
without transactions can potentially be harmful.
|
301
|
+
|
302
|
+
- On a per-job basis. This is the recommended approach for jobs that either open
|
303
|
+
up their own transaction(s) or jobs that explicitly do not need a transaction
|
304
|
+
for whatever reason.
|
305
|
+
|
306
|
+
Usage of this feature depends on whether you are dealing with an ActiveJob
|
307
|
+
job, an enqueued RailsOps operation or a plain Workhorse job class.
|
308
|
+
|
309
|
+
For ActiveJob:
|
310
|
+
|
311
|
+
1. Add the following mixin to your job class (usually `ApplicationJob`):
|
312
|
+
|
313
|
+
```ruby
|
314
|
+
class ApplicationJob
|
315
|
+
include Workhorse::ActiveJobExtension
|
316
|
+
end
|
317
|
+
```
|
318
|
+
|
319
|
+
2. Use the DSL-method `skip_tx` inside the job classes where you want to
|
320
|
+
disable transaction wrapping, e.g.:
|
321
|
+
|
322
|
+
```ruby
|
323
|
+
class MyJob < ApplicationJob
|
324
|
+
skip_tx
|
325
|
+
|
326
|
+
def perform
|
327
|
+
# Something without transaction
|
328
|
+
end
|
329
|
+
end
|
330
|
+
```
|
331
|
+
|
332
|
+
For enqueuable RailsOps operations:
|
333
|
+
|
334
|
+
1. Add the following static method to your operation class:
|
335
|
+
|
336
|
+
```ruby
|
337
|
+
class MyOp < RailsOps::Operation
|
338
|
+
def self.skip_tx?
|
339
|
+
true
|
340
|
+
end
|
341
|
+
end
|
342
|
+
```
|
343
|
+
|
344
|
+
For plain Workhrose job clases:
|
345
|
+
|
346
|
+
1. Add the following static method to your job class:
|
347
|
+
|
348
|
+
```ruby
|
349
|
+
class MyJob
|
350
|
+
def self.skip_tx?
|
351
|
+
true
|
352
|
+
end
|
353
|
+
end
|
354
|
+
|
281
355
|
## Exception handling
|
282
356
|
|
283
357
|
Per default, exceptions occurring in a worker thread will only be visible in the
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.2.
|
1
|
+
1.2.15
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Workhorse
|
2
|
+
module ActiveJobExtension
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
class_attribute :_skip_tx
|
7
|
+
self._skip_tx = false
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
def skip_tx
|
12
|
+
self._skip_tx = true
|
13
|
+
end
|
14
|
+
|
15
|
+
def skip_tx?
|
16
|
+
_skip_tx
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -1,9 +1,15 @@
|
|
1
1
|
module Workhorse::Jobs
|
2
2
|
class RunActiveJob
|
3
|
+
attr_reader :job_data
|
4
|
+
|
3
5
|
def initialize(job_data)
|
4
6
|
@job_data = job_data
|
5
7
|
end
|
6
8
|
|
9
|
+
def job_class
|
10
|
+
@job_data['job_class'].safe_constantize
|
11
|
+
end
|
12
|
+
|
7
13
|
def perform
|
8
14
|
ActiveJob::Base.execute(@job_data)
|
9
15
|
end
|
data/lib/workhorse/performer.rb
CHANGED
@@ -61,7 +61,11 @@ module Workhorse
|
|
61
61
|
log 'Performing', :info
|
62
62
|
log "Description: #{@db_job.description}", :info unless @db_job.description.blank?
|
63
63
|
|
64
|
-
|
64
|
+
inner_job_class = deserialized_job.try(:job_class) || deserialized_job.class
|
65
|
+
skip_tx = inner_job_class.try(:skip_tx?)
|
66
|
+
log "SKIP TX: #{skip_tx.inspect}".red, :error
|
67
|
+
|
68
|
+
if Workhorse.perform_jobs_in_tx && !skip_tx
|
65
69
|
Workhorse.tx_callback.call do
|
66
70
|
deserialized_job.perform
|
67
71
|
end
|
data/lib/workhorse/poller.rb
CHANGED
@@ -111,8 +111,8 @@ module Workhorse
|
|
111
111
|
'connection properly. On MySQL, use "show processlist;" to see which connection(s) ' \
|
112
112
|
'is / are holding the lock for a long period of time and consider killing them using '\
|
113
113
|
"MySQL's \"kill <Id>\" command. This message will be issued only once per worker " \
|
114
|
-
|
115
|
-
|
114
|
+
'and may only be re-triggered if the error happens again *after* the lock has ' \
|
115
|
+
'been solved in the meantime.'
|
116
116
|
|
117
117
|
worker.log message
|
118
118
|
exception = StandardError.new(message)
|
data/lib/workhorse.rb
CHANGED
data/workhorse.gemspec
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: workhorse 1.2.
|
2
|
+
# stub: workhorse 1.2.15 ruby lib
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "workhorse".freeze
|
6
|
-
s.version = "1.2.
|
6
|
+
s.version = "1.2.15"
|
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 = "2023-
|
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/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/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, "workhorse.gemspec".freeze]
|
11
|
+
s.date = "2023-08-28"
|
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/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, "workhorse.gemspec".freeze]
|
13
13
|
s.rubygems_version = "3.0.3".freeze
|
14
14
|
s.summary = "Multi-threaded job backend with database queuing for ruby.".freeze
|
15
15
|
s.test_files = ["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/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]
|
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: 1.2.
|
4
|
+
version: 1.2.15
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sitrox
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-08-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -178,8 +178,8 @@ dependencies:
|
|
178
178
|
- - ">="
|
179
179
|
- !ruby/object:Gem::Version
|
180
180
|
version: '0'
|
181
|
-
description:
|
182
|
-
email:
|
181
|
+
description:
|
182
|
+
email:
|
183
183
|
executables: []
|
184
184
|
extensions: []
|
185
185
|
extra_rdoc_files: []
|
@@ -203,6 +203,7 @@ files:
|
|
203
203
|
- lib/generators/workhorse/templates/config/initializers/workhorse.rb
|
204
204
|
- lib/generators/workhorse/templates/create_table_jobs.rb
|
205
205
|
- lib/workhorse.rb
|
206
|
+
- lib/workhorse/active_job_extension.rb
|
206
207
|
- lib/workhorse/daemon.rb
|
207
208
|
- lib/workhorse/daemon/shell_handler.rb
|
208
209
|
- lib/workhorse/db_job.rb
|
@@ -227,10 +228,10 @@ files:
|
|
227
228
|
- test/workhorse/pool_test.rb
|
228
229
|
- test/workhorse/worker_test.rb
|
229
230
|
- workhorse.gemspec
|
230
|
-
homepage:
|
231
|
+
homepage:
|
231
232
|
licenses: []
|
232
233
|
metadata: {}
|
233
|
-
post_install_message:
|
234
|
+
post_install_message:
|
234
235
|
rdoc_options: []
|
235
236
|
require_paths:
|
236
237
|
- lib
|
@@ -245,8 +246,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
245
246
|
- !ruby/object:Gem::Version
|
246
247
|
version: '0'
|
247
248
|
requirements: []
|
248
|
-
rubygems_version: 3.
|
249
|
-
signing_key:
|
249
|
+
rubygems_version: 3.4.6
|
250
|
+
signing_key:
|
250
251
|
specification_version: 4
|
251
252
|
summary: Multi-threaded job backend with database queuing for ruby.
|
252
253
|
test_files:
|