switchman-inst-jobs 4.3.2 → 4.4.0

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: 024c887329179bac0f9961d4ee813225593d3012efdfcb90747dfc8013b470d3
4
- data.tar.gz: bcc91999036a817920b7a529a84cbe4f7dffc51e3629f14910e6d9dc44ffef6f
3
+ metadata.gz: f308b462ca12380d7575235b5e462045d03bcdf3602265c8ce526700b1846b6b
4
+ data.tar.gz: ed883697bf559536dd84364e8a40b74465c790fa72b66268151d66812b7fda07
5
5
  SHA512:
6
- metadata.gz: 97ffa7cb9912e45e88330df7dc5ef8d56868f6c1ad09829dc331c9c973096fb82d4518a2b4873a1f6b1572cab5cac947e0a2132e630209aebe9f6f3d9da7e6c9
7
- data.tar.gz: e48e3ad03914eac68efdcb8d5dde9cb2abc0e5f42d9ff883b035176d223838ccf8377b36561af493b7e8ace9a88192a562f651d0297b4d7142c75053fdfc6129
6
+ metadata.gz: 2258e5e4aae65d9fac61d9037ec3ece167c5f18dae08050167d9175384e231137dddeed8774950646484e6f8d6b165c4287977ec6aa78f3261bf486944e268ca
7
+ data.tar.gz: c715f2e7cf3b31af9860c1be5db6cca0bb784327acb3a0647980ca3f760dda160398dfc51f68490309ddb71f56abab0fd430c8a99e3d7add6efc7a20688101aa
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "parallel"
4
-
5
3
  module SwitchmanInstJobs
6
4
  class JobsMigrator
7
5
  class << self
@@ -7,11 +7,11 @@ module SwitchmanInstJobs
7
7
  self
8
8
  end
9
9
 
10
- def jobs_held
10
+ def jobs_held # rubocop:disable Naming/PredicateMethod
11
11
  false
12
12
  end
13
13
 
14
- def block_stranded
14
+ def block_stranded # rubocop:disable Naming/PredicateMethod
15
15
  false
16
16
  end
17
17
  end
@@ -22,56 +22,82 @@ module SwitchmanInstJobs
22
22
  # Adapted from hold/unhold methods in base delayed jobs base
23
23
  # Wait is required to be able to safely move jobs
24
24
  def hold_jobs!(wait: false)
25
- self.jobs_held = true
26
- save! if changed?
27
- delayed_jobs_shard.activate(::Delayed::Backend::ActiveRecord::AbstractJob) do
28
- lock_jobs_for_hold
29
- end
30
- return unless wait
31
-
32
- delayed_jobs_shard.activate(::Delayed::Backend::ActiveRecord::AbstractJob) do
33
- while ::Delayed::Job.where(shard_id: id)
34
- .where.not(locked_at: nil)
35
- .where.not(locked_by: ::Delayed::Backend::Base::ON_HOLD_LOCKED_BY).exists?
36
- sleep 10
37
- lock_jobs_for_hold
38
- end
39
- end
25
+ ::Switchman::Shard.where(id: self).hold_jobs!(wait:)
40
26
  end
41
27
 
42
28
  def unhold_jobs!
43
- self.jobs_held = false
44
- if changed?
45
- save!
29
+ ::Switchman::Shard.where(id: self).unhold_jobs!
30
+ end
31
+
32
+ module ClassMethods
33
+ # Adapted from hold/unhold methods in base delayed jobs base
34
+ # Wait is required to be able to safely move jobs
35
+ def hold_jobs!(wait: false)
36
+ shards = all.to_a
37
+ wait_for_caches = false
38
+ shards.each do |shard|
39
+ shard.jobs_held = true
40
+ if shard.changed?
41
+ shard.save!
42
+ wait_for_caches = true if wait
43
+ end
44
+ end
45
+ shards_by_jobs_shard(shards).each do |jobs_shard, shard_ids|
46
+ jobs_shard.activate(::Delayed::Backend::ActiveRecord::AbstractJob) do
47
+ lock_jobs_for_hold(shard_ids)
48
+ end
49
+ end
50
+ return unless wait
51
+
46
52
  # Wait a little over the 60 second in-process shard cache clearing
47
53
  # threshold to ensure that all new jobs are now being enqueued
48
- # unlocked
54
+ # locked
49
55
  Rails.logger.debug("Waiting for caches to clear")
50
- sleep(65)
51
- end
52
- delayed_jobs_shard.activate(::Delayed::Backend::ActiveRecord::AbstractJob) do
53
- ::Delayed::Job.where(locked_by: ::Delayed::Backend::Base::ON_HOLD_LOCKED_BY, shard_id: id)
54
- .in_batches(of: 10_000)
55
- .update_all(
56
- locked_by: nil,
57
- locked_at: nil,
58
- attempts: 0,
59
- failed_at: nil
60
- )
56
+ sleep(65) if wait && wait_for_caches
57
+
58
+ shards_by_jobs_shard(shards).each do |jobs_shard, shard_ids|
59
+ jobs_shard.activate(::Delayed::Backend::ActiveRecord::AbstractJob) do
60
+ while ::Delayed::Job.where(shard_id: shard_ids)
61
+ .where.not(locked_at: nil)
62
+ .where.not(locked_by: ::Delayed::Backend::Base::ON_HOLD_LOCKED_BY).exists?
63
+ sleep 10
64
+ lock_jobs_for_hold(shard_ids)
65
+ end
66
+ end
67
+ end
61
68
  end
62
- end
63
-
64
- private
65
69
 
66
- def lock_jobs_for_hold
67
- ::Delayed::Job.where(locked_at: nil, shard_id: id).in_batches(of: 10_000).update_all(
68
- locked_by: ::Delayed::Backend::Base::ON_HOLD_LOCKED_BY,
69
- locked_at: ::Delayed::Job.db_time_now,
70
- attempts: ::Delayed::Backend::Base::ON_HOLD_COUNT
71
- )
72
- end
70
+ def unhold_jobs!
71
+ shards = all.to_a
72
+ waited = false
73
+ shards.each do |shard|
74
+ shard.jobs_held = false
75
+ next unless shard.changed?
76
+
77
+ shard.save!
78
+ next if waited
79
+
80
+ # Wait a little over the 60 second in-process shard cache clearing
81
+ # threshold to ensure that all new jobs are now being enqueued
82
+ # unlocked
83
+ Rails.logger.debug("Waiting for caches to clear")
84
+ sleep(65)
85
+ waited = true
86
+ end
87
+ shards_by_jobs_shard(shards).each do |jobs_shard, shard_ids|
88
+ jobs_shard.activate(::Delayed::Backend::ActiveRecord::AbstractJob) do
89
+ ::Delayed::Job.where(locked_by: ::Delayed::Backend::Base::ON_HOLD_LOCKED_BY, shard_id: shard_ids)
90
+ .in_batches(of: 10_000)
91
+ .update_all(
92
+ locked_by: nil,
93
+ locked_at: nil,
94
+ attempts: 0,
95
+ failed_at: nil
96
+ )
97
+ end
98
+ end
99
+ end
73
100
 
74
- module ClassMethods
75
101
  def clear_cache
76
102
  super
77
103
  remove_instance_variable(:@delayed_jobs_shards) if instance_variable_defined?(:@delayed_jobs_shards)
@@ -130,6 +156,22 @@ module SwitchmanInstJobs
130
156
 
131
157
  ::Switchman::Shard.merge(scope)
132
158
  end
159
+
160
+ private
161
+
162
+ # Group the given shards by the shard their jobs live on, returning a
163
+ # hash of delayed_jobs_shard => [shard_id, ...]
164
+ def shards_by_jobs_shard(shards)
165
+ shards.group_by(&:delayed_jobs_shard).transform_values { |group| group.map(&:id) }
166
+ end
167
+
168
+ def lock_jobs_for_hold(shard_ids)
169
+ ::Delayed::Job.where(locked_at: nil, shard_id: shard_ids).in_batches(of: 10_000).update_all(
170
+ locked_by: ::Delayed::Backend::Base::ON_HOLD_LOCKED_BY,
171
+ locked_at: ::Delayed::Job.db_time_now,
172
+ attempts: ::Delayed::Backend::Base::ON_HOLD_COUNT
173
+ )
174
+ end
133
175
  end
134
176
  end
135
177
  end
@@ -8,7 +8,7 @@ module SwitchmanInstJobs
8
8
  @cached_at = Time.zone.now
9
9
  end
10
10
 
11
- def clear(force: false)
11
+ def clear(force: false) # rubocop:disable Naming/PredicateMethod
12
12
  if force || @cached_at < @timeout.call
13
13
  @block.call
14
14
  @cached_at = Time.zone.now
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SwitchmanInstJobs
4
- VERSION = "4.3.2"
4
+ VERSION = "4.4.0"
5
5
  end
@@ -7,9 +7,7 @@ module SwitchmanInstJobs
7
7
  cattr_accessor :delayed_jobs_shard_fallback
8
8
 
9
9
  def self.initialize_active_record
10
- ::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(
11
- ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
12
- )
10
+ ActiveSupport.on_load(:active_record_postgresqladapter) { prepend ActiveRecord::ConnectionAdapters::PostgreSQLAdapter }
13
11
  end
14
12
 
15
13
  def self.initialize_inst_jobs
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: switchman-inst-jobs
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.3.2
4
+ version: 4.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bryan Petty
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2026-02-02 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: inst-jobs
@@ -30,61 +29,40 @@ dependencies:
30
29
  - - "<"
31
30
  - !ruby/object:Gem::Version
32
31
  version: '4.0'
33
- - !ruby/object:Gem::Dependency
34
- name: parallel
35
- requirement: !ruby/object:Gem::Requirement
36
- requirements:
37
- - - ">="
38
- - !ruby/object:Gem::Version
39
- version: '1.19'
40
- type: :runtime
41
- prerelease: false
42
- version_requirements: !ruby/object:Gem::Requirement
43
- requirements:
44
- - - ">="
45
- - !ruby/object:Gem::Version
46
- version: '1.19'
47
32
  - !ruby/object:Gem::Dependency
48
33
  name: railties
49
34
  requirement: !ruby/object:Gem::Requirement
50
35
  requirements:
51
36
  - - ">="
52
37
  - !ruby/object:Gem::Version
53
- version: '7.0'
38
+ version: '7.2'
54
39
  - - "<"
55
40
  - !ruby/object:Gem::Version
56
- version: '8.1'
41
+ version: '8.2'
57
42
  type: :runtime
58
43
  prerelease: false
59
44
  version_requirements: !ruby/object:Gem::Requirement
60
45
  requirements:
61
46
  - - ">="
62
47
  - !ruby/object:Gem::Version
63
- version: '7.0'
48
+ version: '7.2'
64
49
  - - "<"
65
50
  - !ruby/object:Gem::Version
66
- version: '8.1'
51
+ version: '8.2'
67
52
  - !ruby/object:Gem::Dependency
68
53
  name: switchman
69
54
  requirement: !ruby/object:Gem::Requirement
70
55
  requirements:
71
- - - ">="
72
- - !ruby/object:Gem::Version
73
- version: 3.5.14
74
- - - "<"
56
+ - - "~>"
75
57
  - !ruby/object:Gem::Version
76
- version: '5.0'
58
+ version: '4.3'
77
59
  type: :runtime
78
60
  prerelease: false
79
61
  version_requirements: !ruby/object:Gem::Requirement
80
62
  requirements:
81
- - - ">="
82
- - !ruby/object:Gem::Version
83
- version: 3.5.14
84
- - - "<"
63
+ - - "~>"
85
64
  - !ruby/object:Gem::Version
86
- version: '5.0'
87
- description:
65
+ version: '4.3'
88
66
  email:
89
67
  - bpetty@instructure.com
90
68
  executables: []
@@ -164,7 +142,6 @@ licenses:
164
142
  metadata:
165
143
  allowed_push_host: https://rubygems.org
166
144
  rubygems_mfa_required: 'true'
167
- post_install_message:
168
145
  rdoc_options: []
169
146
  require_paths:
170
147
  - lib
@@ -172,15 +149,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
172
149
  requirements:
173
150
  - - ">="
174
151
  - !ruby/object:Gem::Version
175
- version: '3.2'
152
+ version: '3.3'
176
153
  required_rubygems_version: !ruby/object:Gem::Requirement
177
154
  requirements:
178
155
  - - ">="
179
156
  - !ruby/object:Gem::Version
180
157
  version: '0'
181
158
  requirements: []
182
- rubygems_version: 3.4.19
183
- signing_key:
159
+ rubygems_version: 3.6.9
184
160
  specification_version: 4
185
161
  summary: Switchman and Instructure Jobs compatibility gem.
186
162
  test_files: []