switchman-inst-jobs 3.0.4 → 4.0.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.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/db/migrate/20101216224513_create_delayed_jobs.rb +1 -1
  3. data/db/migrate/20110208031356_add_delayed_jobs_tag.rb +1 -1
  4. data/db/migrate/20110426161613_add_delayed_jobs_max_attempts.rb +1 -1
  5. data/db/migrate/20110516225834_add_delayed_jobs_strand.rb +1 -1
  6. data/db/migrate/20110531144916_cleanup_delayed_jobs_indexes.rb +1 -1
  7. data/db/migrate/20110610213249_optimize_delayed_jobs.rb +1 -1
  8. data/db/migrate/20110831210257_add_delayed_jobs_next_in_strand.rb +1 -1
  9. data/db/migrate/20120510004759_delayed_jobs_delete_trigger_lock_for_update.rb +1 -1
  10. data/db/migrate/20120531150712_drop_psql_jobs_pop_fn.rb +1 -1
  11. data/db/migrate/20120607164022_delayed_jobs_use_advisory_locks.rb +1 -1
  12. data/db/migrate/20120607181141_index_jobs_on_locked_by.rb +2 -2
  13. data/db/migrate/20120608191051_add_jobs_run_at_index.rb +2 -2
  14. data/db/migrate/20120927184213_change_delayed_jobs_handler_to_text.rb +1 -1
  15. data/db/migrate/20140505215131_add_failed_jobs_original_job_id.rb +1 -1
  16. data/db/migrate/20140505215510_copy_failed_jobs_original_id.rb +2 -2
  17. data/db/migrate/20140505223637_drop_failed_jobs_original_id.rb +1 -1
  18. data/db/migrate/20140512213941_add_source_to_jobs.rb +1 -1
  19. data/db/migrate/20150807133223_add_max_concurrent_to_jobs.rb +1 -1
  20. data/db/migrate/20151123210429_add_expires_at_to_jobs.rb +1 -1
  21. data/db/migrate/20151210162949_improve_max_concurrent.rb +1 -1
  22. data/db/migrate/20161206323555_add_back_default_string_limits_jobs.rb +1 -1
  23. data/db/migrate/20170308045400_add_shard_id_to_delayed_jobs.rb +1 -11
  24. data/db/migrate/20170308045401_add_delayed_jobs_shard_id_to_switchman_shards.rb +5 -0
  25. data/db/migrate/20181217155351_speed_up_max_concurrent_triggers.rb +1 -1
  26. data/db/migrate/20190726154743_make_critical_columns_not_null.rb +1 -1
  27. data/db/migrate/20200330230722_add_id_to_get_delayed_jobs_index.rb +2 -2
  28. data/db/migrate/20200824222232_speed_up_max_concurrent_delete_trigger.rb +1 -1
  29. data/db/migrate/20200825011002_add_strand_order_override.rb +2 -2
  30. data/lib/switchman_inst_jobs.rb +5 -0
  31. data/lib/switchman_inst_jobs/active_record/connection_adapters/connection_pool.rb +15 -0
  32. data/lib/switchman_inst_jobs/delayed/backend/base.rb +13 -11
  33. data/lib/switchman_inst_jobs/delayed/pool.rb +1 -1
  34. data/lib/switchman_inst_jobs/delayed/settings.rb +9 -0
  35. data/lib/switchman_inst_jobs/delayed/worker.rb +2 -2
  36. data/lib/switchman_inst_jobs/delayed/worker/health_check.rb +13 -14
  37. data/lib/switchman_inst_jobs/engine.rb +6 -4
  38. data/lib/switchman_inst_jobs/jobs_migrator.rb +64 -47
  39. data/lib/switchman_inst_jobs/switchman/shard.rb +17 -23
  40. data/lib/switchman_inst_jobs/version.rb +1 -1
  41. metadata +38 -29
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f447f30d1f541b4fe85ad0d867276957b5ed583ddd01e70c509834c0441892bc
4
- data.tar.gz: 677a35494a2b54c609017b335019a98510ca3db04e26e61778ad5a8abc0f9377
3
+ metadata.gz: 1e76d31061b35e05fb85de802c868f5244c386f39490b236b7e2fa48160c1b4d
4
+ data.tar.gz: 81d2c12f67012e962b7d45157f5df7f045a3f4f0c45df2c9294661125524f234
5
5
  SHA512:
6
- metadata.gz: 4dead22acfe97a4a5c06ba7ae348916c39e22cef000754c98d7b4e3ecb9a3312fb2fdffaba1e889812bd77efa9ab2d0ecc9ef6bba3d8325fafb18fe99f70278b
7
- data.tar.gz: 05513257e9b30f44e2cb10ee5eb497a66906c38b8e525fb2373326ec81d6cb84df413f02283d46faf3a85d8e996f7da66cbf4b59335e23a743329ad1c1ef6f7c
6
+ metadata.gz: cb73f1c14a052801826a5f95cdfda52ecd73703cdc1b82b320a4b4ba69ba5ef2b4f77f01d41b1bec667df5b16a02529d8297f7de5726a392e65e086e0ad81570
7
+ data.tar.gz: 6b806f4e8e1e74e589090f75e54de9f12fe3e6ac5f97fc08296adc1c998055a082f7f815d0f7a6362d4745770e7791db100f640e6dadba5c8196ed0e940109b4
@@ -1,6 +1,6 @@
1
1
  class CreateDelayedJobs < ActiveRecord::Migration[4.2]
2
2
  def connection
3
- Delayed::Backend::ActiveRecord::Job.connection
3
+ Delayed::Backend::ActiveRecord::AbstractJob.connection
4
4
  end
5
5
 
6
6
  def up
@@ -1,6 +1,6 @@
1
1
  class AddDelayedJobsTag < ActiveRecord::Migration[4.2]
2
2
  def connection
3
- Delayed::Backend::ActiveRecord::Job.connection
3
+ Delayed::Backend::ActiveRecord::AbstractJob.connection
4
4
  end
5
5
 
6
6
  def up
@@ -1,6 +1,6 @@
1
1
  class AddDelayedJobsMaxAttempts < ActiveRecord::Migration[4.2]
2
2
  def connection
3
- Delayed::Backend::ActiveRecord::Job.connection
3
+ Delayed::Backend::ActiveRecord::AbstractJob.connection
4
4
  end
5
5
 
6
6
  def up
@@ -1,6 +1,6 @@
1
1
  class AddDelayedJobsStrand < ActiveRecord::Migration[4.2]
2
2
  def connection
3
- Delayed::Backend::ActiveRecord::Job.connection
3
+ Delayed::Backend::ActiveRecord::AbstractJob.connection
4
4
  end
5
5
 
6
6
  def up
@@ -1,6 +1,6 @@
1
1
  class CleanupDelayedJobsIndexes < ActiveRecord::Migration[4.2]
2
2
  def connection
3
- Delayed::Backend::ActiveRecord::Job.connection
3
+ Delayed::Backend::ActiveRecord::AbstractJob.connection
4
4
  end
5
5
 
6
6
  def up
@@ -1,6 +1,6 @@
1
1
  class OptimizeDelayedJobs < ActiveRecord::Migration[4.2]
2
2
  def connection
3
- Delayed::Backend::ActiveRecord::Job.connection
3
+ Delayed::Backend::ActiveRecord::AbstractJob.connection
4
4
  end
5
5
 
6
6
  def up
@@ -1,6 +1,6 @@
1
1
  class AddDelayedJobsNextInStrand < ActiveRecord::Migration[4.2]
2
2
  def connection
3
- Delayed::Backend::ActiveRecord::Job.connection
3
+ Delayed::Backend::ActiveRecord::AbstractJob.connection
4
4
  end
5
5
 
6
6
  def up
@@ -1,6 +1,6 @@
1
1
  class DelayedJobsDeleteTriggerLockForUpdate < ActiveRecord::Migration[4.2]
2
2
  def connection
3
- Delayed::Backend::ActiveRecord::Job.connection
3
+ Delayed::Backend::ActiveRecord::AbstractJob.connection
4
4
  end
5
5
 
6
6
  def up
@@ -1,6 +1,6 @@
1
1
  class DropPsqlJobsPopFn < ActiveRecord::Migration[4.2]
2
2
  def connection
3
- Delayed::Backend::ActiveRecord::Job.connection
3
+ Delayed::Backend::ActiveRecord::AbstractJob.connection
4
4
  end
5
5
 
6
6
  def up
@@ -1,6 +1,6 @@
1
1
  class DelayedJobsUseAdvisoryLocks < ActiveRecord::Migration[4.2]
2
2
  def connection
3
- Delayed::Backend::ActiveRecord::Job.connection
3
+ Delayed::Backend::ActiveRecord::AbstractJob.connection
4
4
  end
5
5
 
6
6
  def up
@@ -1,8 +1,8 @@
1
1
  class IndexJobsOnLockedBy < ActiveRecord::Migration[4.2]
2
- disable_ddl_transaction! if respond_to?(:disable_ddl_transaction!)
2
+ disable_ddl_transaction!
3
3
 
4
4
  def connection
5
- Delayed::Backend::ActiveRecord::Job.connection
5
+ Delayed::Backend::ActiveRecord::AbstractJob.connection
6
6
  end
7
7
 
8
8
  def up
@@ -1,8 +1,8 @@
1
1
  class AddJobsRunAtIndex < ActiveRecord::Migration[4.2]
2
- disable_ddl_transaction! if respond_to?(:disable_ddl_transaction!)
2
+ disable_ddl_transaction!
3
3
 
4
4
  def connection
5
- Delayed::Backend::ActiveRecord::Job.connection
5
+ Delayed::Backend::ActiveRecord::AbstractJob.connection
6
6
  end
7
7
 
8
8
  def up
@@ -1,6 +1,6 @@
1
1
  class ChangeDelayedJobsHandlerToText < ActiveRecord::Migration[4.2]
2
2
  def connection
3
- Delayed::Job.connection
3
+ Delayed::Backend::ActiveRecord::AbstractJob.connection
4
4
  end
5
5
 
6
6
  def up
@@ -1,6 +1,6 @@
1
1
  class AddFailedJobsOriginalJobId < ActiveRecord::Migration[4.2]
2
2
  def connection
3
- Delayed::Backend::ActiveRecord::Job.connection
3
+ Delayed::Backend::ActiveRecord::AbstractJob.connection
4
4
  end
5
5
 
6
6
  def up
@@ -1,11 +1,11 @@
1
1
  class CopyFailedJobsOriginalId < ActiveRecord::Migration[4.2]
2
2
  def connection
3
- Delayed::Backend::ActiveRecord::Job.connection
3
+ Delayed::Backend::ActiveRecord::AbstractJob.connection
4
4
  end
5
5
 
6
6
  def up
7
7
  # this is a smaller, less frequently accessed table, so we just update all at once
8
- Delayed::Backend::ActiveRecord::Job::Failed.where('original_job_id is null').update_all('original_job_id = original_id')
8
+ Delayed::Backend::ActiveRecord::Job::Failed.where(original_job_id: nil).update_all('original_job_id = original_id')
9
9
  end
10
10
 
11
11
  def down; end
@@ -1,6 +1,6 @@
1
1
  class DropFailedJobsOriginalId < ActiveRecord::Migration[4.2]
2
2
  def connection
3
- Delayed::Backend::ActiveRecord::Job.connection
3
+ Delayed::Backend::ActiveRecord::AbstractJob.connection
4
4
  end
5
5
 
6
6
  def up
@@ -1,6 +1,6 @@
1
1
  class AddSourceToJobs < ActiveRecord::Migration[4.2]
2
2
  def connection
3
- Delayed::Job.connection
3
+ Delayed::Backend::ActiveRecord::AbstractJob.connection
4
4
  end
5
5
 
6
6
  def up
@@ -1,6 +1,6 @@
1
1
  class AddMaxConcurrentToJobs < ActiveRecord::Migration[4.2]
2
2
  def connection
3
- Delayed::Job.connection
3
+ Delayed::Backend::ActiveRecord::AbstractJob.connection
4
4
  end
5
5
 
6
6
  def up
@@ -1,6 +1,6 @@
1
1
  class AddExpiresAtToJobs < ActiveRecord::Migration[4.2]
2
2
  def connection
3
- Delayed::Job.connection
3
+ Delayed::Backend::ActiveRecord::AbstractJob.connection
4
4
  end
5
5
 
6
6
  def up
@@ -1,6 +1,6 @@
1
1
  class ImproveMaxConcurrent < ActiveRecord::Migration[4.2]
2
2
  def connection
3
- Delayed::Job.connection
3
+ Delayed::Backend::ActiveRecord::AbstractJob.connection
4
4
  end
5
5
 
6
6
  def up
@@ -1,6 +1,6 @@
1
1
  class AddBackDefaultStringLimitsJobs < ActiveRecord::Migration[4.2]
2
2
  def connection
3
- Delayed::Job.connection
3
+ Delayed::Backend::ActiveRecord::AbstractJob.connection
4
4
  end
5
5
 
6
6
  def up
@@ -2,7 +2,7 @@ class AddShardIdToDelayedJobs < ActiveRecord::Migration[4.2]
2
2
  disable_ddl_transaction!
3
3
 
4
4
  def connection
5
- Delayed::Backend::ActiveRecord::Job.connection
5
+ Delayed::Backend::ActiveRecord::AbstractJob.connection
6
6
  end
7
7
 
8
8
  def up
@@ -11,19 +11,9 @@ class AddShardIdToDelayedJobs < ActiveRecord::Migration[4.2]
11
11
 
12
12
  add_column :failed_jobs, :shard_id, :integer, limit: 8
13
13
  add_index :failed_jobs, :shard_id, algorithm: :concurrently
14
-
15
- add_column :switchman_shards, :delayed_jobs_shard_id, :integer, limit: 8
16
- add_foreign_key(
17
- :switchman_shards,
18
- :switchman_shards,
19
- column: :delayed_jobs_shard_id
20
- )
21
14
  end
22
15
 
23
16
  def down
24
- remove_foreign_key :switchman_shards, column: :delayed_jobs_shard_id
25
- remove_column :switchman_shards, :delayed_jobs_shard_id
26
-
27
17
  remove_index :failed_jobs, :shard_id
28
18
  remove_column :failed_jobs, :shard_id
29
19
 
@@ -0,0 +1,5 @@
1
+ class AddDelayedJobsShardIdToSwitchmanShards < ActiveRecord::Migration[5.2]
2
+ def change
3
+ add_reference :switchman_shards, :delayed_jobs_shard, foreign_key: { to_table: :switchman_shards }, index: false, if_not_exists: true
4
+ end
5
+ end
@@ -1,6 +1,6 @@
1
1
  class SpeedUpMaxConcurrentTriggers < ActiveRecord::Migration[4.2]
2
2
  def connection
3
- Delayed::Job.connection
3
+ Delayed::Backend::ActiveRecord::AbstractJob.connection
4
4
  end
5
5
 
6
6
  def up
@@ -1,6 +1,6 @@
1
1
  class MakeCriticalColumnsNotNull < ActiveRecord::Migration[4.2]
2
2
  def connection
3
- Delayed::Job.connection
3
+ Delayed::Backend::ActiveRecord::AbstractJob.connection
4
4
  end
5
5
 
6
6
  def up
@@ -1,8 +1,8 @@
1
1
  class AddIdToGetDelayedJobsIndex < ActiveRecord::Migration[4.2]
2
- disable_ddl_transaction! if respond_to?(:disable_ddl_transaction!)
2
+ disable_ddl_transaction!
3
3
 
4
4
  def connection
5
- Delayed::Job.connection
5
+ Delayed::Backend::ActiveRecord::AbstractJob.connection
6
6
  end
7
7
 
8
8
  def up
@@ -1,6 +1,6 @@
1
1
  class SpeedUpMaxConcurrentDeleteTrigger < ActiveRecord::Migration[4.2]
2
2
  def connection
3
- Delayed::Job.connection
3
+ Delayed::Backend::ActiveRecord::AbstractJob.connection
4
4
  end
5
5
 
6
6
  def up
@@ -1,8 +1,8 @@
1
1
  class AddStrandOrderOverride < ActiveRecord::Migration[4.2]
2
- disable_ddl_transaction! if respond_to?(:disable_ddl_transaction!)
2
+ disable_ddl_transaction!
3
3
 
4
4
  def connection
5
- Delayed::Job.connection
5
+ Delayed::Backend::ActiveRecord::AbstractJob.connection
6
6
  end
7
7
 
8
8
  def up
@@ -5,6 +5,9 @@ module SwitchmanInstJobs
5
5
  cattr_accessor :delayed_jobs_shard_fallback
6
6
 
7
7
  def self.initialize_active_record
8
+ ::ActiveRecord::ConnectionAdapters::ConnectionPool.prepend(
9
+ ActiveRecord::ConnectionAdapters::ConnectionPool
10
+ )
8
11
  ::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(
9
12
  ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
10
13
  )
@@ -36,8 +39,10 @@ module SwitchmanInstJobs
36
39
  end
37
40
  end
38
41
 
42
+ require 'switchman_inst_jobs/active_record/connection_adapters/connection_pool'
39
43
  require 'switchman_inst_jobs/active_record/connection_adapters/postgresql_adapter'
40
44
  require 'switchman_inst_jobs/active_record/migration'
45
+ require 'switchman_inst_jobs/delayed/settings'
41
46
  require 'switchman_inst_jobs/delayed/backend/base'
42
47
  require 'switchman_inst_jobs/delayed/message_sending'
43
48
  require 'switchman_inst_jobs/delayed/pool'
@@ -0,0 +1,15 @@
1
+ module SwitchmanInstJobs
2
+ module ActiveRecord
3
+ module ConnectionAdapters
4
+ module ConnectionPool
5
+ def shard
6
+ if connection_klass == ::Delayed::Backend::ActiveRecord::AbstractJob
7
+ return shard_stack.last || ::Switchman::Shard.current(::ActiveRecord::Base).delayed_jobs_shard
8
+ end
9
+
10
+ super
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -18,40 +18,38 @@ module SwitchmanInstJobs
18
18
  enqueue_options = options.merge(
19
19
  current_shard: current_shard
20
20
  )
21
- enqueue_job = -> { ::GuardRail.activate(:master) { super(object, **enqueue_options) } }
21
+ enqueue_job = -> { ::GuardRail.activate(:primary) { super(object, **enqueue_options) } }
22
22
 
23
23
  # Another dj shard must be currently manually activated, so just use that
24
24
  # In general this will only happen in unusual circumstances like tests
25
25
  # also if migrations are running, always use the current shard's job shard
26
26
  if ::ActiveRecord::Migration.open_migrations.zero? &&
27
- current_shard.delayed_jobs_shard != ::Switchman::Shard.current(:delayed_jobs)
27
+ current_shard.delayed_jobs_shard !=
28
+ ::Switchman::Shard.current(::Delayed::Backend::ActiveRecord::AbstractJob)
28
29
  enqueue_job.call
29
30
  else
30
- ::Switchman::Shard.default.activate do
31
- current_shard = ::Switchman::Shard.lookup(current_shard.id)
32
- end
31
+ current_shard = ::Switchman::Shard.lookup(current_shard.id)
33
32
  current_job_shard = current_shard.delayed_jobs_shard
34
33
 
35
34
  if (options[:singleton] || options[:strand]) && current_shard.block_stranded
36
35
  enqueue_options[:next_in_strand] = false
37
36
  end
38
37
 
39
- current_job_shard.activate(:delayed_jobs) do
38
+ current_job_shard.activate(::Delayed::Backend::ActiveRecord::AbstractJob) do
40
39
  enqueue_job.call
41
40
  end
42
41
  end
43
42
  end
44
43
 
45
44
  def configured_shard_ids
46
- (::Delayed::Settings.worker_config.try(:[], 'workers') || []).
47
- map { |w| w['shard'] }.compact.uniq
45
+ ::SwitchmanInstJobs::Delayed::Settings.configured_shard_ids
48
46
  end
49
47
 
50
48
  def processes_locked_locally
51
49
  shard_ids = configured_shard_ids
52
50
  if shard_ids.any?
53
51
  shards = shard_ids.map { |shard_id| ::Delayed::Worker.shard(shard_id) }
54
- ::Switchman::Shard.with_each_shard(shards, [:delayed_jobs]) do
52
+ ::Switchman::Shard.with_each_shard(shards, [::Delayed::Backend::ActiveRecord::AbstractJob]) do
55
53
  super
56
54
  end
57
55
  else
@@ -62,7 +60,9 @@ module SwitchmanInstJobs
62
60
 
63
61
  def self.prepended(base)
64
62
  base.singleton_class.prepend(ClassMethods)
65
- base.shard_category = :delayed_jobs if base.name == 'Delayed::Backend::ActiveRecord::Job'
63
+ return unless base.name == 'Delayed::Backend::ActiveRecord::Job'
64
+
65
+ ::Delayed::Backend::ActiveRecord::AbstractJob.sharded_model
66
66
  end
67
67
 
68
68
  def current_shard
@@ -82,6 +82,8 @@ module SwitchmanInstJobs
82
82
  end
83
83
 
84
84
  def invoke_job
85
+ raise ShardNotFoundError, shard_id unless current_shard
86
+
85
87
  current_shard.activate { super }
86
88
  end
87
89
 
@@ -89,7 +91,7 @@ module SwitchmanInstJobs
89
91
  raise ShardNotFoundError, shard_id unless current_shard
90
92
 
91
93
  current_shard.activate { super }
92
- rescue ::Switchman::ConnectionError, PG::ConnectionBad, PG::UndefinedTable
94
+ rescue PG::ConnectionBad, PG::UndefinedTable
93
95
  # likely a missing shard with a stale cache
94
96
  current_shard.send(:clear_cache)
95
97
  ::Switchman::Shard.clear_cache
@@ -20,7 +20,7 @@ module SwitchmanInstJobs
20
20
  shard_ids = @config[:workers].pluck(:shard).uniq
21
21
  shards = shard_ids.map { |shard_id| ::Delayed::Worker.shard(shard_id) }
22
22
  end
23
- ::Switchman::Shard.with_each_shard(shards, [:delayed_jobs]) do
23
+ ::Switchman::Shard.with_each_shard(shards, [::Delayed::Backend::ActiveRecord::AbstractJob]) do
24
24
  super
25
25
  end
26
26
  end
@@ -0,0 +1,9 @@
1
+ module SwitchmanInstJobs
2
+ module Delayed
3
+ module Settings
4
+ def self.configured_shard_ids
5
+ (::Delayed::Settings.worker_config.try(:[], 'workers') || []).map { |w| w['shard'] }.compact.uniq
6
+ end
7
+ end
8
+ end
9
+ end
@@ -16,14 +16,14 @@ module SwitchmanInstJobs
16
16
  end
17
17
 
18
18
  def start
19
- shard.activate(:delayed_jobs) { super }
19
+ shard.activate(::Delayed::Backend::ActiveRecord::AbstractJob) { super }
20
20
  end
21
21
 
22
22
  # Worker#run is usually only called from Worker#start, but if the worker
23
23
  # is called directly from the console, we want to make sure it still gets
24
24
  # the right shard activated.
25
25
  def run
26
- shard.activate(:delayed_jobs) { super }
26
+ shard.activate(::Delayed::Backend::ActiveRecord::AbstractJob) { super }
27
27
  end
28
28
 
29
29
  def shard
@@ -18,22 +18,21 @@ module SwitchmanInstJobs
18
18
  ::Delayed::Settings.worker_health_check_config['service_name'] = original_service_name
19
19
  end
20
20
 
21
- def reschedule_abandoned_jobs(call_super: false)
22
- shards = ::Switchman::Shard.delayed_jobs_shards.to_a
23
- call_super = shards.first if shards.length == 1
24
- unless call_super == false
25
- call_super.activate(:delayed_jobs) do
26
- return munge_service_name(call_super) { super() }
21
+ def reschedule_abandoned_jobs
22
+ shard_ids = ::SwitchmanInstJobs::Delayed::Settings.configured_shard_ids
23
+ shards = shard_ids.map { |shard_id| ::Delayed::Worker.shard(shard_id) }
24
+ ::Switchman::Shard.with_each_shard(shards,
25
+ [::ActiveRecord::Base, ::Delayed::Backend::ActiveRecord::AbstractJob]) do
26
+ munge_service_name(::Switchman::Shard.current) do
27
+ # because this rescheduling process is running on every host, we need
28
+ # to make sure that it's functioning for each shard the current
29
+ # host is programmed to interact with, but ONLY for those shards.
30
+ # reading the config lets us iterate over any shards this host should
31
+ # work with and lets us pick the correct service name to identify which
32
+ # hosts are currently alive and valid via the health checks
33
+ super()
27
34
  end
28
35
  end
29
-
30
- ::Switchman::Shard.with_each_shard(shards, [:delayed_jobs], exception: :ignore) do
31
- shard = ::Switchman::Shard.current(:delayed_jobs)
32
- singleton = <<~SINGLETON
33
- periodic: Delayed::Worker::HealthCheck.reschedule_abandoned_jobs:#{shard.id}
34
- SINGLETON
35
- delay(singleton: singleton).reschedule_abandoned_jobs(call_super: shard)
36
- end
37
36
  end
38
37
  end
39
38
  end
@@ -11,7 +11,9 @@ module SwitchmanInstJobs
11
11
 
12
12
  ::Delayed::Worker.lifecycle.around(:work_queue_pop) do |worker, config, &block|
13
13
  if config[:shard]
14
- ::Switchman::Shard.lookup(config[:shard]).activate(:delayed_jobs) { block.call(worker, config) }
14
+ ::Switchman::Shard.lookup(config[:shard]).activate(::Delayed::Backend::ActiveRecord::AbstractJob) do
15
+ block.call(worker, config)
16
+ end
15
17
  else
16
18
  block.call(worker, config)
17
19
  end
@@ -23,8 +25,8 @@ module SwitchmanInstJobs
23
25
  ::Switchman::Shard.clear_cache
24
26
  ::Switchman::Shard.default.activate do
25
27
  current_job_shard = ::Switchman::Shard.lookup(job.shard_id).delayed_jobs_shard
26
- if current_job_shard != ::Switchman::Shard.current(:delayed_jobs)
27
- current_job_shard.activate(:delayed_jobs) do
28
+ if current_job_shard != ::Switchman::Shard.current(::Delayed::Backend::ActiveRecord::AbstractJob)
29
+ current_job_shard.activate(::Delayed::Backend::ActiveRecord::AbstractJob) do
28
30
  j = ::Delayed::Job.where(strand: job.strand).next_in_strand_order.first
29
31
  j.update_column(:next_in_strand, true) if j && !j.next_in_strand
30
32
  end
@@ -43,7 +45,7 @@ module SwitchmanInstJobs
43
45
  end
44
46
 
45
47
  config.after_initialize do
46
- ::Switchman::Shard.default.delayed_jobs_shard.activate!(:delayed_jobs)
48
+ ::Switchman::Shard.default.delayed_jobs_shard.activate!(::Delayed::Backend::ActiveRecord::AbstractJob)
47
49
  end
48
50
  end
49
51
  end
@@ -17,10 +17,10 @@ module SwitchmanInstJobs
17
17
  return yield if shards.empty?
18
18
 
19
19
  shard = shards.pop
20
- current_shard = ::Switchman::Shard.current(:delayed_jobs)
21
- shard.activate(:delayed_jobs) do
20
+ current_shard = ::Switchman::Shard.current(::Delayed::Backend::ActiveRecord::AbstractJob)
21
+ shard.activate(::Delayed::Backend::ActiveRecord::AbstractJob) do
22
22
  ::Delayed::Job.transaction do
23
- current_shard.activate(:delayed_jobs) do
23
+ current_shard.activate(::Delayed::Backend::ActiveRecord::AbstractJob) do
24
24
  transaction_on(shards, &block)
25
25
  end
26
26
  end
@@ -39,31 +39,49 @@ module SwitchmanInstJobs
39
39
 
40
40
  # Do the updates in batches and then just clear redis instead of clearing them one at a time
41
41
  target_shards.each do |target_shard, shards|
42
- ::Switchman::Shard.where(id: shards).update_all(delayed_jobs_shard_id: target_shard, block_stranded: true)
42
+ updates = { delayed_jobs_shard_id: target_shard, block_stranded: true }
43
+ updates[:updated_at] = Time.zone.now if ::Switchman::Shard.column_names.include?('updated_at')
44
+ ::Switchman::Shard.where(id: shards).update_all(updates)
43
45
  end
44
46
  clear_shard_cache
45
47
 
46
- # Wait a little over the 60 second in-process shard cache clearing
47
- # threshold to ensure that all new stranded jobs are now being
48
- # enqueued with next_in_strand: false
49
- Rails.logger.debug('Waiting for caches to clear')
50
- sleep(65) unless @skip_cache_wait
51
-
52
48
  ::Switchman::Shard.clear_cache
53
49
  # rubocop:disable Style/CombinableLoops
54
50
  # We first migrate strands so that we can stop blocking strands before we migrate unstranded jobs
55
51
  source_shards.each do |s|
56
- ::Switchman::Shard.lookup(s).activate(:delayed_jobs) { migrate_strands }
52
+ ::Switchman::Shard.lookup(s).activate(::Delayed::Backend::ActiveRecord::AbstractJob) { migrate_strands }
57
53
  end
58
54
 
59
55
  source_shards.each do |s|
60
- ::Switchman::Shard.lookup(s).activate(:delayed_jobs) { migrate_everything }
56
+ ::Switchman::Shard.lookup(s).activate(::Delayed::Backend::ActiveRecord::AbstractJob) { migrate_everything }
61
57
  end
58
+ ensure_unblock_stranded_for(shard_map.map(&:first))
62
59
  # rubocop:enable Style/CombinableLoops
63
60
  end
64
61
 
65
- def clear_shard_cache
62
+ # if :migrate_strands ran on any shards that fell into scenario 1, then
63
+ # block_stranded never got flipped, so do that now.
64
+ def ensure_unblock_stranded_for(shards)
65
+ shards = ::Switchman::Shard.where(id: shards, block_stranded: true).to_a
66
+ return unless shards.any?
67
+
68
+ ::Switchman::Shard.where(id: shards).update_all(block_stranded: false)
69
+ clear_shard_cache
70
+
71
+ # shards is an array of shard objects that is now stale cause block_stranded has been updated.
72
+ shards.map(&:delayed_jobs_shard).uniq.each do |dj_shard|
73
+ unblock_strands(dj_shard)
74
+ end
75
+ end
76
+
77
+ def clear_shard_cache(debug_message = nil)
66
78
  ::Switchman.cache.clear
79
+ Rails.logger.debug("Waiting for caches to clear #{debug_message}")
80
+ # Wait a little over the 60 second in-process shard cache clearing
81
+ # threshold to ensure that all new stranded jobs are now being
82
+ # enqueued with next_in_strand: false
83
+ # @skip_cache_wait is for spec usage only
84
+ sleep(65) unless @skip_cache_wait
67
85
  end
68
86
 
69
87
  # This method expects that all relevant shards already have block_stranded: true
@@ -85,7 +103,7 @@ module SwitchmanInstJobs
85
103
  # 4) no running job, jobs moved: set next_in_strand=true on the first of
86
104
  # those (= do nothing since it should already be true)
87
105
 
88
- source_shard = ::Switchman::Shard.current(:delayed_jobs)
106
+ source_shard = ::Switchman::Shard.current(::Delayed::Backend::ActiveRecord::AbstractJob)
89
107
  strand_scope = ::Delayed::Job.shard(source_shard).where.not(strand: nil)
90
108
  shard_map = build_shard_map(strand_scope, source_shard)
91
109
  shard_map.each do |(target_shard, source_shard_ids)|
@@ -94,7 +112,7 @@ module SwitchmanInstJobs
94
112
  # 1) is taken care of because it should not show up here in strands
95
113
  strands = shard_scope.distinct.order(:strand).pluck(:strand)
96
114
 
97
- target_shard.activate(:delayed_jobs) do
115
+ target_shard.activate(::Delayed::Backend::ActiveRecord::AbstractJob) do
98
116
  strands.each do |strand|
99
117
  transaction_on([source_shard, target_shard]) do
100
118
  this_strand_scope = shard_scope.where(strand: strand)
@@ -125,7 +143,7 @@ module SwitchmanInstJobs
125
143
  update_all(next_in_strand: false)
126
144
  end
127
145
 
128
- # 4) is taken care of here, by leaveing next_in_strand alone and
146
+ # 4) is taken care of here, by leaving next_in_strand alone and
129
147
  # it should execute on the new shard
130
148
  batch_move_jobs(
131
149
  target_shard: target_shard,
@@ -141,42 +159,39 @@ module SwitchmanInstJobs
141
159
  updated = ::Switchman::Shard.where(id: source_shard_ids, block_stranded: true).
142
160
  update_all(block_stranded: false)
143
161
  # If this is being manually re-run for some reason to clean something up, don't wait for nothing to happen
144
- unless updated.zero?
145
- clear_shard_cache
146
- # Wait a little over the 60 second in-process shard cache clearing
147
- # threshold to ensure that all new stranded jobs are now being
148
- # enqueued with next_in_strand: false
149
- Rails.logger.debug("Waiting for caches to clear (#{source_shard.id} -> #{target_shard.id})")
150
- # for spec usage only
151
- sleep(65) unless @skip_cache_wait
152
- end
162
+ clear_shard_cache("(#{source_shard.id} -> #{target_shard.id})") unless updated.zero?
163
+
153
164
  ::Switchman::Shard.clear_cache
154
165
  # At this time, let's unblock all the strands on the target shard that aren't being held by a blocker
155
166
  # but actually could have run and we just didn't know it because we didn't know if they had jobs
156
167
  # on the source shard
157
- target_shard.activate(:delayed_jobs) do
158
- loop do
159
- # We only want to unlock stranded jobs where they don't belong to a blocked shard (if they *do* belong)
160
- # to a blocked shard, they must be part of a concurrent jobs migration from a different source shard to
161
- # this target shard, so we shouldn't unlock them yet. We only ever unlock one job here to keep the
162
- # logic cleaner; if the job is n-stranded, after the first one runs, the trigger will unlock larger
163
- # batches
164
- break if ::Delayed::Job.where(id: ::Delayed::Job.select('DISTINCT ON (strand) id').
165
- where.not(strand: nil).
166
- where.not(shard_id: ::Switchman::Shard.where(block_stranded: true).pluck(:id)).where(
167
- ::Delayed::Job.select(1).from("#{::Delayed::Job.quoted_table_name} dj2").
168
- where("dj2.next_in_strand = true OR dj2.source = 'JobsMigrator::StrandBlocker'").
169
- where('dj2.strand = delayed_jobs.strand').arel.exists.not
170
- ).order(:strand, :strand_order_override, :id)).limit(500).update_all(next_in_strand: true).zero?
171
- end
172
- end
168
+ unblock_strands(target_shard)
169
+ end
170
+ end
171
+ end
172
+
173
+ def unblock_strands(target_shard)
174
+ target_shard.activate(::Delayed::Backend::ActiveRecord::AbstractJob) do
175
+ loop do
176
+ # We only want to unlock stranded jobs where they don't belong to a blocked shard (if they *do* belong)
177
+ # to a blocked shard, they must be part of a concurrent jobs migration from a different source shard to
178
+ # this target shard, so we shouldn't unlock them yet. We only ever unlock one job here to keep the
179
+ # logic cleaner; if the job is n-stranded, after the first one runs, the trigger will unlock larger
180
+ # batches
181
+ break if ::Delayed::Job.where(id: ::Delayed::Job.select('DISTINCT ON (strand) id').
182
+ where.not(strand: nil).
183
+ where.not(shard_id: ::Switchman::Shard.where(block_stranded: true).pluck(:id)).where(
184
+ ::Delayed::Job.select(1).from("#{::Delayed::Job.quoted_table_name} dj2").
185
+ where("dj2.next_in_strand = true OR dj2.source = 'JobsMigrator::StrandBlocker'").
186
+ where('dj2.strand = delayed_jobs.strand').arel.exists.not
187
+ ).order(:strand, :strand_order_override, :id)).limit(500).update_all(next_in_strand: true).zero?
173
188
  end
174
189
  end
175
190
  end
176
191
 
177
192
  def migrate_everything
178
- source_shard = ::Switchman::Shard.current(:delayed_jobs)
179
- scope = ::Delayed::Job.shard(source_shard).where('strand IS NULL')
193
+ source_shard = ::Switchman::Shard.current(::Delayed::Backend::ActiveRecord::AbstractJob)
194
+ scope = ::Delayed::Job.shard(source_shard).where(strand: nil)
180
195
 
181
196
  shard_map = build_shard_map(scope, source_shard)
182
197
  shard_map.each do |(target_shard, source_shard_ids)|
@@ -209,7 +224,7 @@ module SwitchmanInstJobs
209
224
  # Adapted from get_and_lock_next_available in delayed/backend/active_record.rb
210
225
  target_jobs = scope.limit(1000).lock('FOR UPDATE SKIP LOCKED')
211
226
 
212
- query = source_shard.activate(:delayed_jobs) do
227
+ query = source_shard.activate(::Delayed::Backend::ActiveRecord::AbstractJob) do
213
228
  "WITH limited_jobs AS (#{target_jobs.to_sql}) " \
214
229
  "UPDATE #{::Delayed::Job.quoted_table_name} " \
215
230
  "SET locked_by = #{::Delayed::Job.connection.quote(::Delayed::Backend::Base::ON_HOLD_LOCKED_BY)}, " \
@@ -218,7 +233,9 @@ module SwitchmanInstJobs
218
233
  "RETURNING #{::Delayed::Job.quoted_table_name}.*"
219
234
  end
220
235
 
221
- jobs = source_shard.activate(:delayed_jobs) { ::Delayed::Job.find_by_sql(query) }
236
+ jobs = source_shard.activate(::Delayed::Backend::ActiveRecord::AbstractJob) do
237
+ ::Delayed::Job.find_by_sql(query)
238
+ end
222
239
  new_jobs = jobs.map do |job|
223
240
  new_job = job.dup
224
241
  new_job.shard = target_shard
@@ -236,10 +253,10 @@ module SwitchmanInstJobs
236
253
  new_job
237
254
  end
238
255
  transaction_on([source_shard, target_shard]) do
239
- target_shard.activate(:delayed_jobs) do
256
+ target_shard.activate(::Delayed::Backend::ActiveRecord::AbstractJob) do
240
257
  bulk_insert_jobs(new_jobs)
241
258
  end
242
- source_shard.activate(:delayed_jobs) do
259
+ source_shard.activate(::Delayed::Backend::ActiveRecord::AbstractJob) do
243
260
  ::Delayed::Job.delete(jobs)
244
261
  end
245
262
  end
@@ -14,7 +14,7 @@ module SwitchmanInstJobs
14
14
  shard = ::Switchman::Shard.lookup(delayed_jobs_shard_id)
15
15
  return shard if shard
16
16
  end
17
- database_server&.delayed_jobs_shard(self)
17
+ @delayed_jobs_shard ||= database_server&.delayed_jobs_shard(self)
18
18
  end
19
19
 
20
20
  # Adapted from hold/unhold methods in base delayed jobs base
@@ -22,12 +22,12 @@ module SwitchmanInstJobs
22
22
  def hold_jobs!(wait: false)
23
23
  self.jobs_held = true
24
24
  save! if changed?
25
- delayed_jobs_shard.activate(:delayed_jobs) do
25
+ delayed_jobs_shard.activate(::Delayed::Backend::ActiveRecord::AbstractJob) do
26
26
  lock_jobs_for_hold
27
27
  end
28
28
  return unless wait
29
29
 
30
- delayed_jobs_shard.activate(:delayed_jobs) do
30
+ delayed_jobs_shard.activate(::Delayed::Backend::ActiveRecord::AbstractJob) do
31
31
  while ::Delayed::Job.where(shard_id: id).
32
32
  where.not(locked_at: nil).
33
33
  where.not(locked_by: ::Delayed::Backend::Base::ON_HOLD_LOCKED_BY).exists?
@@ -39,8 +39,15 @@ module SwitchmanInstJobs
39
39
 
40
40
  def unhold_jobs!
41
41
  self.jobs_held = false
42
- save! if changed?
43
- delayed_jobs_shard.activate(:delayed_jobs) do
42
+ if changed?
43
+ save!
44
+ # Wait a little over the 60 second in-process shard cache clearing
45
+ # threshold to ensure that all new jobs are now being enqueued
46
+ # unlocked
47
+ Rails.logger.debug('Waiting for caches to clear')
48
+ sleep(65)
49
+ end
50
+ delayed_jobs_shard.activate(::Delayed::Backend::ActiveRecord::AbstractJob) do
44
51
  ::Delayed::Job.where(locked_by: ::Delayed::Backend::Base::ON_HOLD_LOCKED_BY, shard_id: id).
45
52
  in_batches(of: 10_000).
46
53
  update_all(
@@ -68,22 +75,14 @@ module SwitchmanInstJobs
68
75
  remove_instance_variable(:@delayed_jobs_shards) if instance_variable_defined?(:@delayed_jobs_shards)
69
76
  end
70
77
 
71
- def current(category = :primary)
72
- if category == :delayed_jobs
73
- active_shards[category] || super(:primary).delayed_jobs_shard
74
- else
75
- super
76
- end
77
- end
78
-
79
78
  def activate!(categories)
80
79
  if !@skip_delayed_job_auto_activation &&
81
- !categories[:delayed_jobs] &&
82
- categories[:primary] &&
83
- categories[:primary] != active_shards[:primary]
80
+ !categories[::Delayed::Backend::ActiveRecord::AbstractJob] &&
81
+ categories[::ActiveRecord::Base] &&
82
+ categories[::ActiveRecord::Base] != ::Switchman::Shard.current(::ActiveRecord::Base)
84
83
  skip_delayed_job_auto_activation do
85
- categories[:delayed_jobs] =
86
- categories[:primary].delayed_jobs_shard
84
+ categories[::Delayed::Backend::ActiveRecord::AbstractJob] =
85
+ categories[::ActiveRecord::Base].delayed_jobs_shard
87
86
  end
88
87
  end
89
88
  super
@@ -97,11 +96,6 @@ module SwitchmanInstJobs
97
96
  @skip_delayed_job_auto_activation = was
98
97
  end
99
98
 
100
- def create
101
- db = ::Switchman::DatabaseServer.server_for_new_shard
102
- db.create_new_shard
103
- end
104
-
105
99
  def periodic_clear_shard_cache
106
100
  # TODO: make this configurable
107
101
  @timed_cache ||= TimedCache.new(-> { 60.to_i.seconds.ago }) do
@@ -1,3 +1,3 @@
1
1
  module SwitchmanInstJobs
2
- VERSION = '3.0.4'.freeze
2
+ VERSION = '4.0.0'.freeze
3
3
  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: 3.0.4
4
+ version: 4.0.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: 2020-11-18 00:00:00.000000000 Z
11
+ date: 2021-05-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: inst-jobs
@@ -16,20 +16,20 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.0'
19
+ version: '2.0'
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 1.0.3
22
+ version: 2.3.1
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - "~>"
28
28
  - !ruby/object:Gem::Version
29
- version: '1.0'
29
+ version: '2.0'
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 1.0.3
32
+ version: 2.3.1
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: parallel
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -50,34 +50,40 @@ dependencies:
50
50
  requirements:
51
51
  - - ">="
52
52
  - !ruby/object:Gem::Version
53
- version: '5.2'
53
+ version: '6.1'
54
54
  - - "<"
55
55
  - !ruby/object:Gem::Version
56
- version: '6.1'
56
+ version: '6.2'
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: '5.2'
63
+ version: '6.1'
64
64
  - - "<"
65
65
  - !ruby/object:Gem::Version
66
- version: '6.1'
66
+ version: '6.2'
67
67
  - !ruby/object:Gem::Dependency
68
68
  name: switchman
69
69
  requirement: !ruby/object:Gem::Requirement
70
70
  requirements:
71
71
  - - "~>"
72
72
  - !ruby/object:Gem::Version
73
- version: '2.0'
73
+ version: '3.0'
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: 3.0.1
74
77
  type: :runtime
75
78
  prerelease: false
76
79
  version_requirements: !ruby/object:Gem::Requirement
77
80
  requirements:
78
81
  - - "~>"
79
82
  - !ruby/object:Gem::Version
80
- version: '2.0'
83
+ version: '3.0'
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: 3.0.1
81
87
  - !ruby/object:Gem::Dependency
82
88
  name: bundler
83
89
  requirement: !ruby/object:Gem::Requirement
@@ -107,19 +113,19 @@ dependencies:
107
113
  - !ruby/object:Gem::Version
108
114
  version: '0'
109
115
  - !ruby/object:Gem::Dependency
110
- name: imperium
116
+ name: diplomat
111
117
  requirement: !ruby/object:Gem::Requirement
112
118
  requirements:
113
- - - ">="
119
+ - - "~>"
114
120
  - !ruby/object:Gem::Version
115
- version: '0'
121
+ version: 2.5.1
116
122
  type: :development
117
123
  prerelease: false
118
124
  version_requirements: !ruby/object:Gem::Requirement
119
125
  requirements:
120
- - - ">="
126
+ - - "~>"
121
127
  - !ruby/object:Gem::Version
122
- version: '0'
128
+ version: 2.5.1
123
129
  - !ruby/object:Gem::Dependency
124
130
  name: newrelic_rpm
125
131
  requirement: !ruby/object:Gem::Requirement
@@ -182,70 +188,70 @@ dependencies:
182
188
  requirements:
183
189
  - - "~>"
184
190
  - !ruby/object:Gem::Version
185
- version: '3.6'
191
+ version: '3.10'
186
192
  type: :development
187
193
  prerelease: false
188
194
  version_requirements: !ruby/object:Gem::Requirement
189
195
  requirements:
190
196
  - - "~>"
191
197
  - !ruby/object:Gem::Version
192
- version: '3.6'
198
+ version: '3.10'
193
199
  - !ruby/object:Gem::Dependency
194
200
  name: rspec-rails
195
201
  requirement: !ruby/object:Gem::Requirement
196
202
  requirements:
197
203
  - - "~>"
198
204
  - !ruby/object:Gem::Version
199
- version: '3.6'
205
+ version: '5.0'
200
206
  type: :development
201
207
  prerelease: false
202
208
  version_requirements: !ruby/object:Gem::Requirement
203
209
  requirements:
204
210
  - - "~>"
205
211
  - !ruby/object:Gem::Version
206
- version: '3.6'
212
+ version: '5.0'
207
213
  - !ruby/object:Gem::Dependency
208
214
  name: rubocop
209
215
  requirement: !ruby/object:Gem::Requirement
210
216
  requirements:
211
217
  - - "~>"
212
218
  - !ruby/object:Gem::Version
213
- version: 1.3.1
219
+ version: '1.15'
214
220
  type: :development
215
221
  prerelease: false
216
222
  version_requirements: !ruby/object:Gem::Requirement
217
223
  requirements:
218
224
  - - "~>"
219
225
  - !ruby/object:Gem::Version
220
- version: 1.3.1
226
+ version: '1.15'
221
227
  - !ruby/object:Gem::Dependency
222
228
  name: rubocop-rails
223
229
  requirement: !ruby/object:Gem::Requirement
224
230
  requirements:
225
231
  - - "~>"
226
232
  - !ruby/object:Gem::Version
227
- version: 2.8.1
233
+ version: '2.10'
228
234
  type: :development
229
235
  prerelease: false
230
236
  version_requirements: !ruby/object:Gem::Requirement
231
237
  requirements:
232
238
  - - "~>"
233
239
  - !ruby/object:Gem::Version
234
- version: 2.8.1
240
+ version: '2.10'
235
241
  - !ruby/object:Gem::Dependency
236
242
  name: simplecov
237
243
  requirement: !ruby/object:Gem::Requirement
238
244
  requirements:
239
245
  - - "~>"
240
246
  - !ruby/object:Gem::Version
241
- version: '0.18'
247
+ version: '0.21'
242
248
  type: :development
243
249
  prerelease: false
244
250
  version_requirements: !ruby/object:Gem::Requirement
245
251
  requirements:
246
252
  - - "~>"
247
253
  - !ruby/object:Gem::Version
248
- version: '0.18'
254
+ version: '0.21'
249
255
  - !ruby/object:Gem::Dependency
250
256
  name: wwtd
251
257
  requirement: !ruby/object:Gem::Requirement
@@ -289,6 +295,7 @@ files:
289
295
  - db/migrate/20151210162949_improve_max_concurrent.rb
290
296
  - db/migrate/20161206323555_add_back_default_string_limits_jobs.rb
291
297
  - db/migrate/20170308045400_add_shard_id_to_delayed_jobs.rb
298
+ - db/migrate/20170308045401_add_delayed_jobs_shard_id_to_switchman_shards.rb
292
299
  - db/migrate/20181217155351_speed_up_max_concurrent_triggers.rb
293
300
  - db/migrate/20190726154743_make_critical_columns_not_null.rb
294
301
  - db/migrate/20200330230722_add_id_to_get_delayed_jobs_index.rb
@@ -298,11 +305,13 @@ files:
298
305
  - db/migrate/20200825011002_add_strand_order_override.rb
299
306
  - lib/switchman-inst-jobs.rb
300
307
  - lib/switchman_inst_jobs.rb
308
+ - lib/switchman_inst_jobs/active_record/connection_adapters/connection_pool.rb
301
309
  - lib/switchman_inst_jobs/active_record/connection_adapters/postgresql_adapter.rb
302
310
  - lib/switchman_inst_jobs/active_record/migration.rb
303
311
  - lib/switchman_inst_jobs/delayed/backend/base.rb
304
312
  - lib/switchman_inst_jobs/delayed/message_sending.rb
305
313
  - lib/switchman_inst_jobs/delayed/pool.rb
314
+ - lib/switchman_inst_jobs/delayed/settings.rb
306
315
  - lib/switchman_inst_jobs/delayed/worker.rb
307
316
  - lib/switchman_inst_jobs/delayed/worker/health_check.rb
308
317
  - lib/switchman_inst_jobs/engine.rb
@@ -327,14 +336,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
327
336
  requirements:
328
337
  - - ">="
329
338
  - !ruby/object:Gem::Version
330
- version: '2.5'
339
+ version: '2.6'
331
340
  required_rubygems_version: !ruby/object:Gem::Requirement
332
341
  requirements:
333
342
  - - ">="
334
343
  - !ruby/object:Gem::Version
335
344
  version: '0'
336
345
  requirements: []
337
- rubygems_version: 3.1.4
346
+ rubygems_version: 3.2.15
338
347
  signing_key:
339
348
  specification_version: 4
340
349
  summary: Switchman and Instructure Jobs compatibility gem.