workhorse 1.2.13 → 1.2.15

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
  SHA256:
3
- metadata.gz: c528399ac973ce36bd6bdb993ac2d234eddf8836b8fc997031dd4009487ed252
4
- data.tar.gz: 8482be9f53a1c8b5eb238784a6f350f79a0bf7b5c2c42a3921667ef2a82340d6
3
+ metadata.gz: 772b634a73940718f57f2363859977dbc7f20ff4b7c12edada5c4cc499ff5f6c
4
+ data.tar.gz: 8c44df6872578300e6577155626f851ae1cb9202653f835b4dabbcc70fd78c70
5
5
  SHA512:
6
- metadata.gz: 83b44c60c1789755e2d09a2f32ea71728287d54ab1904bf5a6f9e88f225d02da0280d784e56d3352c336efb292aa864f841b85d1c085df7425878551bdec27ed
7
- data.tar.gz: a554b93bc1c0c18bd1472981e2a84e80f79dfc0561f03c89839cc9e4f32d6480cb4fa327cd046cc8d9582a142af1092a4ffb1c5c492cb79fbb5af2fb3ebef725
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.13
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
@@ -5,6 +5,10 @@ module Workhorse::Jobs
5
5
  @params = params
6
6
  end
7
7
 
8
+ def job_class
9
+ @cls
10
+ end
11
+
8
12
  def perform
9
13
  @cls.run!(@params)
10
14
  end
@@ -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
- if Workhorse.perform_jobs_in_tx
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
@@ -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
- "and may only be re-triggered if the error happens again *after* the lock has " \
115
- "been solved in the meantime."
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
@@ -6,6 +6,7 @@ require 'uri'
6
6
 
7
7
  require 'workhorse/enqueuer'
8
8
  require 'workhorse/scoped_env'
9
+ require 'workhorse/active_job_extension'
9
10
 
10
11
  module Workhorse
11
12
  # Check if the available Arel version is greater or equal than 7.0.0
data/workhorse.gemspec CHANGED
@@ -1,15 +1,15 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: workhorse 1.2.13 ruby lib
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.13"
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-02-20"
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.13
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-02-20 00:00:00.000000000 Z
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.0.3.1
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: