switchman-inst-jobs 4.0.17 → 4.2.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: 31b6b1d2dfe3070a63ed755c287ae3b744a42bf16fc57d62dcbc28569e8adeed
4
- data.tar.gz: 7ab79f81effb0e8da6ee01efea3cb10920f601a5a007d6c55b784983b190f1b3
3
+ metadata.gz: e1c01e6bdfd2a5cd3ddd756936a2793526c8e8860883bcd1ea8caa9febad979d
4
+ data.tar.gz: 4998d1686e5dfceffb5c1a41dcf0959266c8caf73bd99aa0e50e89523e41ba51
5
5
  SHA512:
6
- metadata.gz: f8e90f264c6027a3107313569d2d394724bde9a7e30fd1a9b57cafff248bafc8c0405b99018a126e6d7c94bdddda8ec803b080b4fbcb4f5e1b2abceb68f2d02a
7
- data.tar.gz: e7935969ea9bfca9f67b6d133220e6355b264fca916bb003ce8e3e1c0134d77c1d2de59c162623ed783b19fd3c27faeab204a8984c72e3f79967ece531957b24
6
+ metadata.gz: aae64990ef75016c24ded178bf0edcf4b4343499b6d226d6c86104d9d15d23bd7a77acf35e622aff989e3292d0abf59bd15d4dd3d20e11e4f9e66e4fe393e581
7
+ data.tar.gz: 854dd08052ca1b042646ce2fd08c4c0f76d2f5075f11ecebf34f04f8293c3ab2c8d9977817adf2b5e0f6e4c67a6726e49bd4dc9d491b961a391588e78c22a274
@@ -21,7 +21,7 @@ module SwitchmanInstJobs
21
21
  ::Switchman::Shard.periodic_clear_shard_cache
22
22
  current_shard = options[:current_shard] || ::Switchman::Shard.current
23
23
  enqueue_options = options.merge(
24
- current_shard: current_shard
24
+ current_shard:
25
25
  )
26
26
  enqueue_job = -> { ::GuardRail.activate(:primary) { super(object, **enqueue_options) } }
27
27
 
@@ -48,9 +48,7 @@ module SwitchmanInstJobs
48
48
  end
49
49
  end
50
50
 
51
- def configured_shard_ids
52
- ::SwitchmanInstJobs::Delayed::Settings.configured_shard_ids
53
- end
51
+ delegate :configured_shard_ids, to: :"::SwitchmanInstJobs::Delayed::Settings"
54
52
 
55
53
  def processes_locked_locally
56
54
  shard_ids = configured_shard_ids
@@ -3,7 +3,7 @@
3
3
  module SwitchmanInstJobs
4
4
  module GuardRail
5
5
  module ClassMethods
6
- def activate(env, &block)
6
+ def activate(env, &)
7
7
  if ::ActiveRecord::Migration.open_migrations.positive?
8
8
  yield
9
9
  else
@@ -21,7 +21,7 @@ module SwitchmanInstJobs
21
21
  @validation_callbacks = []
22
22
  end
23
23
 
24
- def transaction_on(shards, &block)
24
+ def transaction_on(shards, &)
25
25
  return yield if shards.empty?
26
26
 
27
27
  shard = shards.pop
@@ -29,7 +29,7 @@ module SwitchmanInstJobs
29
29
  shard.activate(::Delayed::Backend::ActiveRecord::AbstractJob) do
30
30
  ::Delayed::Job.transaction do
31
31
  current_shard.activate(::Delayed::Backend::ActiveRecord::AbstractJob) do
32
- transaction_on(shards, &block)
32
+ transaction_on(shards, &)
33
33
  end
34
34
  end
35
35
  end
@@ -37,7 +37,7 @@ module SwitchmanInstJobs
37
37
 
38
38
  def migrate_shards(shard_map)
39
39
  source_shards = Set[]
40
- target_shards = Hash.new([])
40
+ target_shards = Hash.new([].freeze)
41
41
  shard_map.each do |(shard, target_shard)|
42
42
  shard = ::Switchman::Shard.find(shard) unless shard.is_a?(::Switchman::Shard)
43
43
  source_shards << shard.delayed_jobs_shard.id
@@ -45,7 +45,7 @@ module SwitchmanInstJobs
45
45
  target_shards[target_shard] += [shard.id]
46
46
 
47
47
  @validation_callbacks&.each do |proc|
48
- proc.call(shard: shard, target_shard: ::Switchman::Shard.find(target_shard))
48
+ proc.call(shard:, target_shard: ::Switchman::Shard.find(target_shard))
49
49
  end
50
50
  end
51
51
 
@@ -171,10 +171,10 @@ module SwitchmanInstJobs
171
171
  # 4) is taken care of here, by leaving next_in_strand alone and
172
172
  # it should execute on the new shard
173
173
  batch_move_jobs(
174
- target_shard: target_shard,
175
- source_shard: source_shard,
174
+ target_shard:,
175
+ source_shard:,
176
176
  scope: jobs_scope,
177
- batch_size: batch_size
177
+ batch_size:
178
178
  ) do |job, new_job|
179
179
  # This ensures jobs enqueued on the old jobs shard run before jobs on the new jobs queue
180
180
  new_job.strand_order_override = job.strand_order_override - 1
@@ -190,7 +190,7 @@ module SwitchmanInstJobs
190
190
  all_scope = ::Delayed::Job.shard(source_shard).where("strand IS NOT NULL OR singleton IS NOT NULL")
191
191
 
192
192
  singleton_blocker_additional_kwargs = {
193
- locked_at: DateTime.now,
193
+ locked_at: Time.now.utc,
194
194
  locked_by: ::Delayed::Backend::Base::ON_HOLD_BLOCKER
195
195
  }
196
196
 
@@ -230,14 +230,16 @@ module SwitchmanInstJobs
230
230
  blocked_shard_ids = blocked_shards.pluck(:id)
231
231
  query = lambda { |column, scope|
232
232
  ::Delayed::Job
233
- .where(id: ::Delayed::Job.select("DISTINCT ON (#{column}) id")
234
- .where(scope)
233
+ .where(id: ::Delayed::Job
234
+ .with(all_col: ::Delayed::Job.and(scope).distinct.select(column))
235
+ .with(blocked_col: ::Delayed::Job.from("all_col").select(column).where.not(
236
+ ::Delayed::Job.select(1)
237
+ .where(next_in_strand: true).or(::Delayed::Job.where(source: "JobsMigrator::StrandBlocker"))
238
+ .where("#{column} = all_col.#{column}").arel.exists
239
+ ))
240
+ .select("DISTINCT ON (#{column}) id")
235
241
  .where.not(shard_id: blocked_shard_ids)
236
- .where(
237
- ::Delayed::Job.select(1).from("#{::Delayed::Job.quoted_table_name} dj2")
238
- .where("dj2.next_in_strand = true OR dj2.source = 'JobsMigrator::StrandBlocker'")
239
- .where("dj2.#{column} = delayed_jobs.#{column}").arel.exists.not
240
- )
242
+ .where({ column => ::Delayed::Job.from("blocked_col").select(column) })
241
243
  .order(column, :strand_order_override, :id)).limit(batch_size)
242
244
  }
243
245
 
@@ -249,12 +251,13 @@ module SwitchmanInstJobs
249
251
  # batches
250
252
 
251
253
  loop do
252
- break if query.call(:strand, "strand IS NOT NULL").update_all(next_in_strand: true).zero?
254
+ break if query.call(:strand, ::Delayed::Job.where.not(strand: nil)).update_all(next_in_strand: true).zero?
253
255
  end
254
256
 
255
257
  loop do
256
258
  break if query.call(:singleton,
257
- "strand IS NULL AND singleton IS NOT NULL").update_all(next_in_strand: true).zero?
259
+ ::Delayed::Job.where(strand: nil)
260
+ .where.not(singleton: nil)).update_all(next_in_strand: true).zero?
258
261
  end
259
262
  end
260
263
  end
@@ -266,10 +269,10 @@ module SwitchmanInstJobs
266
269
  shard_map = build_shard_map(scope, source_shard)
267
270
  shard_map.each do |(target_shard, source_shard_ids)|
268
271
  batch_move_jobs(
269
- target_shard: target_shard,
270
- source_shard: source_shard,
272
+ target_shard:,
273
+ source_shard:,
271
274
  scope: scope.where(shard_id: source_shard_ids).where(locked_by: nil),
272
- batch_size: batch_size
275
+ batch_size:
273
276
  )
274
277
  end
275
278
  end
@@ -291,7 +294,7 @@ module SwitchmanInstJobs
291
294
  end
292
295
 
293
296
  def unblock_strand!(strand, new_parallelism: nil)
294
- job_scope = ::Delayed::Job.where(strand: strand)
297
+ job_scope = ::Delayed::Job.where(strand:)
295
298
  raise JobsBlockedError if blocked_by_migrator?(job_scope)
296
299
 
297
300
  ::Delayed::Job.transaction do
@@ -321,7 +324,7 @@ module SwitchmanInstJobs
321
324
  end
322
325
 
323
326
  def unblock_singleton!(singleton)
324
- job_scope = ::Delayed::Job.where(strand: nil, singleton: singleton)
327
+ job_scope = ::Delayed::Job.where(strand: nil, singleton:)
325
328
  raise JobsBlockedError if blocked_by_migrator?(job_scope)
326
329
 
327
330
  ::Delayed::Job.transaction do
@@ -334,7 +337,7 @@ module SwitchmanInstJobs
334
337
  if next_in_strand
335
338
  0
336
339
  elsif id
337
- ::Delayed::Job.where(id: id).update_all(next_in_strand: true)
340
+ ::Delayed::Job.where(id:).update_all(next_in_strand: true)
338
341
  end
339
342
  end
340
343
  end
@@ -403,7 +406,7 @@ module SwitchmanInstJobs
403
406
  @before_move_callbacks&.each do |proc|
404
407
  proc.call(
405
408
  old_job: job,
406
- new_job: new_job
409
+ new_job:
407
410
  )
408
411
  end
409
412
  new_job
@@ -6,14 +6,14 @@ module SwitchmanInstJobs
6
6
  module NewRelicJobInvoker
7
7
  include ::NewRelic::Agent::Instrumentation::ControllerInstrumentation if defined?(::NewRelic)
8
8
 
9
- def invoke_job(*args, &block)
9
+ def invoke_job(...)
10
10
  options = {
11
11
  category: NR_TRANSACTION_CATEGORY,
12
12
  path: tag
13
13
  }
14
14
 
15
15
  perform_action_with_newrelic_trace(options) do
16
- super(*args, &block)
16
+ super(...)
17
17
  end
18
18
  end
19
19
  end
@@ -100,7 +100,7 @@ module SwitchmanInstJobs
100
100
 
101
101
  def periodic_clear_shard_cache
102
102
  # TODO: make this configurable
103
- @timed_cache ||= TimedCache.new(-> { 60.to_i.seconds.ago }) do
103
+ @timed_cache ||= TimedCache.new(-> { 60.seconds.ago }) do
104
104
  ::Switchman::Shard.clear_cache
105
105
  end
106
106
  @timed_cache.clear
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SwitchmanInstJobs
4
- VERSION = "4.0.17"
4
+ VERSION = "4.2.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: switchman-inst-jobs
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.17
4
+ version: 4.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bryan Petty
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-02-13 00:00:00.000000000 Z
11
+ date: 2025-08-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: inst-jobs
@@ -50,20 +50,20 @@ dependencies:
50
50
  requirements:
51
51
  - - ">="
52
52
  - !ruby/object:Gem::Version
53
- version: '6.1'
53
+ version: '7.0'
54
54
  - - "<"
55
55
  - !ruby/object:Gem::Version
56
- version: '7.2'
56
+ version: '8.0'
57
57
  type: :runtime
58
58
  prerelease: false
59
59
  version_requirements: !ruby/object:Gem::Requirement
60
60
  requirements:
61
61
  - - ">="
62
62
  - !ruby/object:Gem::Version
63
- version: '6.1'
63
+ version: '7.0'
64
64
  - - "<"
65
65
  - !ruby/object:Gem::Version
66
- version: '7.2'
66
+ version: '8.0'
67
67
  - !ruby/object:Gem::Dependency
68
68
  name: switchman
69
69
  requirement: !ruby/object:Gem::Requirement
@@ -84,202 +84,6 @@ dependencies:
84
84
  - - "<"
85
85
  - !ruby/object:Gem::Version
86
86
  version: '5.0'
87
- - !ruby/object:Gem::Dependency
88
- name: bundler
89
- requirement: !ruby/object:Gem::Requirement
90
- requirements:
91
- - - ">="
92
- - !ruby/object:Gem::Version
93
- version: '0'
94
- type: :development
95
- prerelease: false
96
- version_requirements: !ruby/object:Gem::Requirement
97
- requirements:
98
- - - ">="
99
- - !ruby/object:Gem::Version
100
- version: '0'
101
- - !ruby/object:Gem::Dependency
102
- name: byebug
103
- requirement: !ruby/object:Gem::Requirement
104
- requirements:
105
- - - ">="
106
- - !ruby/object:Gem::Version
107
- version: '0'
108
- type: :development
109
- prerelease: false
110
- version_requirements: !ruby/object:Gem::Requirement
111
- requirements:
112
- - - ">="
113
- - !ruby/object:Gem::Version
114
- version: '0'
115
- - !ruby/object:Gem::Dependency
116
- name: diplomat
117
- requirement: !ruby/object:Gem::Requirement
118
- requirements:
119
- - - "~>"
120
- - !ruby/object:Gem::Version
121
- version: 2.5.1
122
- type: :development
123
- prerelease: false
124
- version_requirements: !ruby/object:Gem::Requirement
125
- requirements:
126
- - - "~>"
127
- - !ruby/object:Gem::Version
128
- version: 2.5.1
129
- - !ruby/object:Gem::Dependency
130
- name: newrelic_rpm
131
- requirement: !ruby/object:Gem::Requirement
132
- requirements:
133
- - - ">="
134
- - !ruby/object:Gem::Version
135
- version: '0'
136
- type: :development
137
- prerelease: false
138
- version_requirements: !ruby/object:Gem::Requirement
139
- requirements:
140
- - - ">="
141
- - !ruby/object:Gem::Version
142
- version: '0'
143
- - !ruby/object:Gem::Dependency
144
- name: pg
145
- requirement: !ruby/object:Gem::Requirement
146
- requirements:
147
- - - "~>"
148
- - !ruby/object:Gem::Version
149
- version: '1.0'
150
- type: :development
151
- prerelease: false
152
- version_requirements: !ruby/object:Gem::Requirement
153
- requirements:
154
- - - "~>"
155
- - !ruby/object:Gem::Version
156
- version: '1.0'
157
- - !ruby/object:Gem::Dependency
158
- name: pry
159
- requirement: !ruby/object:Gem::Requirement
160
- requirements:
161
- - - "~>"
162
- - !ruby/object:Gem::Version
163
- version: '0'
164
- type: :development
165
- prerelease: false
166
- version_requirements: !ruby/object:Gem::Requirement
167
- requirements:
168
- - - "~>"
169
- - !ruby/object:Gem::Version
170
- version: '0'
171
- - !ruby/object:Gem::Dependency
172
- name: rake
173
- requirement: !ruby/object:Gem::Requirement
174
- requirements:
175
- - - "~>"
176
- - !ruby/object:Gem::Version
177
- version: '13'
178
- type: :development
179
- prerelease: false
180
- version_requirements: !ruby/object:Gem::Requirement
181
- requirements:
182
- - - "~>"
183
- - !ruby/object:Gem::Version
184
- version: '13'
185
- - !ruby/object:Gem::Dependency
186
- name: rspec
187
- requirement: !ruby/object:Gem::Requirement
188
- requirements:
189
- - - "~>"
190
- - !ruby/object:Gem::Version
191
- version: '3.10'
192
- type: :development
193
- prerelease: false
194
- version_requirements: !ruby/object:Gem::Requirement
195
- requirements:
196
- - - "~>"
197
- - !ruby/object:Gem::Version
198
- version: '3.10'
199
- - !ruby/object:Gem::Dependency
200
- name: rspec-rails
201
- requirement: !ruby/object:Gem::Requirement
202
- requirements:
203
- - - "~>"
204
- - !ruby/object:Gem::Version
205
- version: '5.0'
206
- type: :development
207
- prerelease: false
208
- version_requirements: !ruby/object:Gem::Requirement
209
- requirements:
210
- - - "~>"
211
- - !ruby/object:Gem::Version
212
- version: '5.0'
213
- - !ruby/object:Gem::Dependency
214
- name: rubocop-inst
215
- requirement: !ruby/object:Gem::Requirement
216
- requirements:
217
- - - "~>"
218
- - !ruby/object:Gem::Version
219
- version: '1'
220
- type: :development
221
- prerelease: false
222
- version_requirements: !ruby/object:Gem::Requirement
223
- requirements:
224
- - - "~>"
225
- - !ruby/object:Gem::Version
226
- version: '1'
227
- - !ruby/object:Gem::Dependency
228
- name: rubocop-rails
229
- requirement: !ruby/object:Gem::Requirement
230
- requirements:
231
- - - "~>"
232
- - !ruby/object:Gem::Version
233
- version: '2.10'
234
- type: :development
235
- prerelease: false
236
- version_requirements: !ruby/object:Gem::Requirement
237
- requirements:
238
- - - "~>"
239
- - !ruby/object:Gem::Version
240
- version: '2.10'
241
- - !ruby/object:Gem::Dependency
242
- name: rubocop-rake
243
- requirement: !ruby/object:Gem::Requirement
244
- requirements:
245
- - - "~>"
246
- - !ruby/object:Gem::Version
247
- version: '0.6'
248
- type: :development
249
- prerelease: false
250
- version_requirements: !ruby/object:Gem::Requirement
251
- requirements:
252
- - - "~>"
253
- - !ruby/object:Gem::Version
254
- version: '0.6'
255
- - !ruby/object:Gem::Dependency
256
- name: rubocop-rspec
257
- requirement: !ruby/object:Gem::Requirement
258
- requirements:
259
- - - "~>"
260
- - !ruby/object:Gem::Version
261
- version: '2.4'
262
- type: :development
263
- prerelease: false
264
- version_requirements: !ruby/object:Gem::Requirement
265
- requirements:
266
- - - "~>"
267
- - !ruby/object:Gem::Version
268
- version: '2.4'
269
- - !ruby/object:Gem::Dependency
270
- name: simplecov
271
- requirement: !ruby/object:Gem::Requirement
272
- requirements:
273
- - - "~>"
274
- - !ruby/object:Gem::Version
275
- version: '0.21'
276
- type: :development
277
- prerelease: false
278
- version_requirements: !ruby/object:Gem::Requirement
279
- requirements:
280
- - - "~>"
281
- - !ruby/object:Gem::Version
282
- version: '0.21'
283
87
  description:
284
88
  email:
285
89
  - bpetty@instructure.com
@@ -367,7 +171,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
367
171
  requirements:
368
172
  - - ">="
369
173
  - !ruby/object:Gem::Version
370
- version: '3.0'
174
+ version: '3.1'
371
175
  required_rubygems_version: !ruby/object:Gem::Requirement
372
176
  requirements:
373
177
  - - ">="