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 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: