good_job 3.27.2 → 3.27.3

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: 1f1caf94daea82b4e273aeaa01d2a44def87934a36275fbe5ca007a27bfceb4d
4
- data.tar.gz: ad46d59cc2166d6386a17a3d0924f27f81c16e1670121b7f252ec9515da4b011
3
+ metadata.gz: 31870d7c454658e1b6b3865535a8af35898f6ac3a1b4e9112da7a485a97506a1
4
+ data.tar.gz: 9776e26adab4e551c10351b33ef223c16340440ad9e9189eecff533aa5583d62
5
5
  SHA512:
6
- metadata.gz: 0c2be38cdbbfc7bb63f65451efc85ac51519f1ebabe7f9324ff5a652344b2e06fb75e93a0f0db0cda5038cf562ea793cf5eab6022cc219a304cab5be42b8dd0c
7
- data.tar.gz: fe5e5d39d0f02a071d8906b155bac1b9467167565544595c38932870e85aff88569b5c9194ea20cf8ea403c134b3a8833e5075e3c8c0bda51982ddea31e6c406
6
+ metadata.gz: 2e8cd2f1e317f5f6421a4a50ce5a3c0af8f0e51199eb5a0c8db0d93f9f5a1d7ded7d621cf79498e756e7c9dbe7c72da24830706975e59a20c0c0b6852c3d60b9
7
+ data.tar.gz: a852a1e0de8dbfaac4b00baa4aa74672846364b617fb392d12a3bbdb0394be1e8183d9cf44d1ced788ba79b05bbe7ab3a986b57dfa67d38873d82cf627ae098a
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## [v3.27.3](https://github.com/bensheldon/good_job/tree/v3.27.3) (2024-03-29)
4
+
5
+ [Full Changelog](https://github.com/bensheldon/good_job/compare/v3.27.2...v3.27.3)
6
+
7
+ **Merged pull requests:**
8
+
9
+ - Revert "Start async adapters `after_initialize` instead of once Active Job and Active Record are loaded and Rails initialized?" [\#1303](https://github.com/bensheldon/good_job/pull/1303) ([bensheldon](https://github.com/bensheldon))
10
+
3
11
  ## [v3.27.2](https://github.com/bensheldon/good_job/tree/v3.27.2) (2024-03-27)
4
12
 
5
13
  [Full Changelog](https://github.com/bensheldon/good_job/compare/v3.27.1...v3.27.2)
@@ -30,7 +30,7 @@ module GoodJob
30
30
  GoodJob::Configuration.validate_execution_mode(@_execution_mode_override) if @_execution_mode_override
31
31
  @capsule = _capsule
32
32
 
33
- start_async if GoodJob._async_ready?
33
+ start_async if GoodJob.async_ready?
34
34
  self.class.instances << self
35
35
  end
36
36
 
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GoodJob # :nodoc:
4
+ # Extends GoodJob module to track Rails boot dependencies.
5
+ module Dependencies
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ mattr_accessor :_framework_ready, default: false
10
+ end
11
+
12
+ class_methods do
13
+ # Whether Rails framework has sufficiently initialized to enable Async execution.
14
+ def async_ready?
15
+ Rails.application.initialized? || _framework_ready
16
+ end
17
+
18
+ def _start_async_adapters
19
+ return unless async_ready?
20
+
21
+ ActiveJob::Base.queue_adapter # Ensure Active Job is initialized
22
+ GoodJob::Adapter.instances
23
+ .select(&:execute_async?)
24
+ .reject(&:async_started?)
25
+ .each(&:start_async)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -49,17 +49,22 @@ module GoodJob
49
49
  end
50
50
 
51
51
  initializer "good_job.start_async" do
52
+ # This hooks into the hookable places during Rails boot, which is unfortunately not Rails.application.initialized?
53
+ # If an Adapter is initialized during boot, we want to want to start async executors once the framework dependencies have loaded.
54
+ # When exactly that happens is out of our control because gems or application code may touch things earlier than expected.
55
+ # For example, as of Rails 6.1, if an ActiveRecord model is touched during boot, that triggers ActiveRecord to load,
56
+ # which touches DestroyAssociationAsyncJob, which loads ActiveJob, which may initialize a GoodJob::Adapter, all of which
57
+ # happens _before_ ActiveRecord finishes loading. GoodJob will deadlock if an async executor is started in the middle of
58
+ # ActiveRecord loading.
52
59
  config.after_initialize do
53
- GoodJob._async_ready = true
54
-
55
- # Ensure Active Record and Active Job are fully loaded
56
- ActiveRecord::Base # rubocop:disable Lint/Void
57
- ActiveJob::Base.queue_adapter
58
-
59
- GoodJob::Adapter.instances
60
- .select(&:execute_async?)
61
- .reject(&:async_started?)
62
- .each(&:start_async)
60
+ ActiveSupport.on_load(:active_record) do
61
+ ActiveSupport.on_load(:active_job) do
62
+ GoodJob._framework_ready = true
63
+ GoodJob._start_async_adapters
64
+ end
65
+ GoodJob._start_async_adapters
66
+ end
67
+ GoodJob._start_async_adapters
63
68
  end
64
69
  end
65
70
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module GoodJob
4
4
  # GoodJob gem version.
5
- VERSION = '3.27.2'
5
+ VERSION = '3.27.3'
6
6
 
7
7
  # GoodJob version as Gem::Version object
8
8
  GEM_VERSION = Gem::Version.new(VERSION)
data/lib/good_job.rb CHANGED
@@ -25,6 +25,7 @@ require_relative "good_job/configuration"
25
25
  require_relative "good_job/cron_manager"
26
26
  require_relative "good_job/current_thread"
27
27
  require_relative "good_job/daemon"
28
+ require_relative "good_job/dependencies"
28
29
  require_relative "good_job/job_performer"
29
30
  require_relative "good_job/job_performer/metrics"
30
31
  require_relative "good_job/log_subscriber"
@@ -45,6 +46,7 @@ require_relative "good_job/thread_status"
45
46
  #
46
47
  # +GoodJob+ is the top-level namespace and exposes configuration attributes.
47
48
  module GoodJob
49
+ include GoodJob::Dependencies
48
50
  include GoodJob::ThreadStatus
49
51
 
50
52
  # Default, null, blank value placeholder.
@@ -112,11 +114,6 @@ module GoodJob
112
114
  # @return [GoodJob::Capsule, nil]
113
115
  mattr_accessor :capsule, default: GoodJob::Capsule.new(configuration: configuration)
114
116
 
115
- mattr_accessor :_async_ready, default: false
116
- def self._async_ready?
117
- _async_ready
118
- end
119
-
120
117
  # Called with exception when a GoodJob thread raises an exception
121
118
  # @param exception [Exception] Exception that was raised
122
119
  # @return [void]
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: good_job
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.27.2
4
+ version: 3.27.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Sheldon
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-03-27 00:00:00.000000000 Z
11
+ date: 2024-03-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activejob
@@ -404,6 +404,7 @@ files:
404
404
  - lib/good_job/cron_manager.rb
405
405
  - lib/good_job/current_thread.rb
406
406
  - lib/good_job/daemon.rb
407
+ - lib/good_job/dependencies.rb
407
408
  - lib/good_job/engine.rb
408
409
  - lib/good_job/interrupt_error.rb
409
410
  - lib/good_job/job_performer.rb