good_job 3.27.2 → 3.27.3

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