good_job 3.99.0 → 4.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +21 -0
  3. data/app/charts/good_job/scheduled_by_queue_chart.rb +2 -2
  4. data/app/controllers/good_job/cron_entries_controller.rb +0 -8
  5. data/app/controllers/good_job/metrics_controller.rb +1 -1
  6. data/app/controllers/good_job/performance_controller.rb +19 -0
  7. data/app/models/concerns/good_job/filterable.rb +1 -1
  8. data/app/models/good_job/base_execution.rb +104 -201
  9. data/app/models/good_job/cron_entry.rb +0 -2
  10. data/app/models/good_job/discrete_execution.rb +1 -31
  11. data/app/models/good_job/execution.rb +3 -7
  12. data/app/models/good_job/job.rb +37 -116
  13. data/app/models/good_job/process.rb +7 -20
  14. data/app/views/good_job/batches/index.html.erb +11 -15
  15. data/app/views/good_job/jobs/_executions.erb +1 -1
  16. data/app/views/good_job/jobs/_table.erb +1 -1
  17. data/app/views/good_job/jobs/show.html.erb +1 -8
  18. data/app/views/good_job/performance/index.html.erb +43 -0
  19. data/app/views/good_job/shared/_navbar.erb +2 -2
  20. data/config/locales/de.yml +4 -7
  21. data/config/locales/en.yml +4 -7
  22. data/config/locales/es.yml +4 -7
  23. data/config/locales/fr.yml +4 -7
  24. data/config/locales/it.yml +4 -7
  25. data/config/locales/ja.yml +4 -7
  26. data/config/locales/ko.yml +4 -7
  27. data/config/locales/nl.yml +4 -7
  28. data/config/locales/pt-BR.yml +4 -7
  29. data/config/locales/ru.yml +4 -7
  30. data/config/locales/tr.yml +4 -7
  31. data/config/locales/uk.yml +4 -7
  32. data/config/routes.rb +1 -1
  33. data/lib/generators/good_job/templates/update/migrations/01_create_good_jobs.rb.erb +65 -3
  34. data/lib/good_job/active_job_extensions/batches.rb +1 -1
  35. data/lib/good_job/active_job_extensions/concurrency.rb +10 -10
  36. data/lib/good_job/adapter.rb +13 -24
  37. data/lib/good_job/configuration.rb +5 -1
  38. data/lib/good_job/current_thread.rb +6 -6
  39. data/lib/good_job/job_performer.rb +2 -2
  40. data/lib/good_job/log_subscriber.rb +2 -10
  41. data/lib/good_job/notifier.rb +3 -3
  42. data/lib/good_job/version.rb +1 -1
  43. data/lib/good_job.rb +16 -21
  44. metadata +18 -32
  45. data/app/controllers/good_job/performances_controller.rb +0 -23
  46. data/app/views/good_job/performances/show.html.erb +0 -50
  47. data/lib/generators/good_job/templates/update/migrations/02_create_good_job_settings.rb.erb +0 -20
  48. data/lib/generators/good_job/templates/update/migrations/03_create_index_good_jobs_jobs_on_priority_created_at_when_unfinished.rb.erb +0 -19
  49. data/lib/generators/good_job/templates/update/migrations/04_create_good_job_batches.rb.erb +0 -35
  50. data/lib/generators/good_job/templates/update/migrations/05_create_good_job_executions.rb.erb +0 -33
  51. data/lib/generators/good_job/templates/update/migrations/06_create_good_jobs_error_event.rb.erb +0 -16
  52. data/lib/generators/good_job/templates/update/migrations/07_recreate_good_job_cron_indexes_with_conditional.rb.erb +0 -45
  53. data/lib/generators/good_job/templates/update/migrations/08_create_good_job_labels.rb.erb +0 -15
  54. data/lib/generators/good_job/templates/update/migrations/09_create_good_job_labels_index.rb.erb +0 -22
  55. data/lib/generators/good_job/templates/update/migrations/10_remove_good_job_active_id_index.rb.erb +0 -21
  56. data/lib/generators/good_job/templates/update/migrations/11_create_index_good_job_jobs_for_candidate_lookup.rb.erb +0 -19
  57. data/lib/generators/good_job/templates/update/migrations/12_create_good_job_execution_error_backtrace.rb.erb +0 -15
  58. data/lib/generators/good_job/templates/update/migrations/13_create_good_job_process_lock_ids.rb.erb +0 -18
  59. data/lib/generators/good_job/templates/update/migrations/14_create_good_job_process_lock_indexes.rb.erb +0 -38
  60. data/lib/generators/good_job/templates/update/migrations/15_create_good_job_execution_duration.rb.erb +0 -15
@@ -18,14 +18,6 @@ module GoodJob
18
18
  # Responds to the +$0.good_job+ notification.
19
19
  # @param event [ActiveSupport::Notifications::Event]
20
20
  # @return [void]
21
- def create(event)
22
- # FIXME: This method does not match any good_job notifications.
23
- execution = event.payload[:execution]
24
-
25
- debug do
26
- "GoodJob created job resource with id #{execution.id}"
27
- end
28
- end
29
21
 
30
22
  # @!macro notification_responder
31
23
  def finished_timer_task(event)
@@ -110,12 +102,12 @@ module GoodJob
110
102
 
111
103
  # @!macro notification_responder
112
104
  def perform_job(event)
113
- execution = event.payload[:execution]
105
+ job = event.payload[:job]
114
106
  process_id = event.payload[:process_id]
115
107
  thread_name = event.payload[:thread_name]
116
108
 
117
109
  info(tags: [process_id, thread_name]) do
118
- "Executed GoodJob #{execution.id}"
110
+ "Executed GoodJob #{job.id}"
119
111
  end
120
112
  end
121
113
 
@@ -51,7 +51,7 @@ module GoodJob # :nodoc:
51
51
  # Send a message via Postgres NOTIFY
52
52
  # @param message [#to_json]
53
53
  def self.notify(message)
54
- connection = ::GoodJob::Execution.connection
54
+ connection = ::GoodJob::Job.connection
55
55
  connection.exec_query <<~SQL.squish
56
56
  NOTIFY #{CHANNEL}, #{connection.quote(message.to_json)}
57
57
  SQL
@@ -251,8 +251,8 @@ module GoodJob # :nodoc:
251
251
 
252
252
  def with_connection
253
253
  Rails.application.executor.wrap do
254
- self.connection = ::GoodJob::Execution.connection_pool.checkout.tap do |conn|
255
- ::GoodJob::Execution.connection_pool.remove(conn)
254
+ self.connection = ::GoodJob::Job.connection_pool.checkout.tap do |conn|
255
+ ::GoodJob::Job.connection_pool.remove(conn)
256
256
  end
257
257
  end
258
258
  connection.execute("SET application_name = #{connection.quote(self.class.name)}")
@@ -2,7 +2,7 @@
2
2
 
3
3
  module GoodJob
4
4
  # GoodJob gem version.
5
- VERSION = '3.99.0'
5
+ VERSION = '4.0.1'
6
6
 
7
7
  # GoodJob version as Gem::Version object
8
8
  GEM_VERSION = Gem::Version.new(VERSION)
data/lib/good_job.rb CHANGED
@@ -58,7 +58,7 @@ module GoodJob
58
58
 
59
59
  # @!attribute [rw] active_record_parent_class
60
60
  # @!scope class
61
- # The ActiveRecord parent class inherited by +GoodJob::Execution+ (default: +ActiveRecord::Base+).
61
+ # The ActiveRecord parent class inherited by +GoodJob::Job+ (default: +ActiveRecord::Base+).
62
62
  # Use this when using multiple databases or other custom ActiveRecord configuration.
63
63
  # @return [ActiveRecord::Base]
64
64
  # @example Change the base class:
@@ -133,6 +133,7 @@ module GoodJob
133
133
  def self.configure_active_record(&block)
134
134
  self._active_record_configuration = block
135
135
  end
136
+
136
137
  mattr_accessor :_active_record_configuration, default: nil
137
138
 
138
139
  # Stop executing jobs.
@@ -208,7 +209,7 @@ module GoodJob
208
209
  include_discarded = GoodJob.configuration.cleanup_discarded_jobs?
209
210
 
210
211
  ActiveSupport::Notifications.instrument("cleanup_preserved_jobs.good_job", { older_than: older_than, timestamp: timestamp }) do |payload|
211
- deleted_executions_count = 0
212
+ deleted_jobs_count = 0
212
213
  deleted_batches_count = 0
213
214
  deleted_discrete_executions_count = 0
214
215
 
@@ -218,31 +219,27 @@ module GoodJob
218
219
  active_job_ids = jobs_query.pluck(:active_job_id)
219
220
  break if active_job_ids.empty?
220
221
 
221
- if GoodJob::Execution.discrete_support?
222
- deleted_discrete_executions = GoodJob::DiscreteExecution.where(active_job_id: active_job_ids).delete_all
223
- deleted_discrete_executions_count += deleted_discrete_executions
224
- end
222
+ deleted_discrete_executions = GoodJob::DiscreteExecution.where(active_job_id: active_job_ids).delete_all
223
+ deleted_discrete_executions_count += deleted_discrete_executions
225
224
 
226
- deleted_executions = GoodJob::Execution.where(active_job_id: active_job_ids).delete_all
227
- deleted_executions_count += deleted_executions
225
+ deleted_jobs = GoodJob::Job.where(active_job_id: active_job_ids).delete_all
226
+ deleted_jobs_count += deleted_jobs
228
227
  end
229
228
 
230
- if GoodJob::BatchRecord.migrated?
231
- batches_query = GoodJob::BatchRecord.finished_before(timestamp).limit(in_batches_of)
232
- batches_query = batches_query.succeeded unless include_discarded
233
- loop do
234
- deleted = batches_query.delete_all
235
- break if deleted.zero?
229
+ batches_query = GoodJob::BatchRecord.finished_before(timestamp).limit(in_batches_of)
230
+ batches_query = batches_query.succeeded unless include_discarded
231
+ loop do
232
+ deleted = batches_query.delete_all
233
+ break if deleted.zero?
236
234
 
237
- deleted_batches_count += deleted
238
- end
235
+ deleted_batches_count += deleted
239
236
  end
240
237
 
241
238
  payload[:destroyed_batches_count] = deleted_batches_count
242
239
  payload[:destroyed_discrete_executions_count] = deleted_discrete_executions_count
243
- payload[:destroyed_executions_count] = deleted_executions_count
240
+ payload[:destroyed_jobs_count] = deleted_jobs_count
244
241
 
245
- destroyed_records_count = deleted_batches_count + deleted_discrete_executions_count + deleted_executions_count
242
+ destroyed_records_count = deleted_batches_count + deleted_discrete_executions_count + deleted_jobs_count
246
243
  payload[:destroyed_records_count] = destroyed_records_count
247
244
 
248
245
  destroyed_records_count
@@ -291,9 +288,7 @@ module GoodJob
291
288
  # For use in tests/CI to validate GoodJob is up-to-date.
292
289
  # @return [Boolean]
293
290
  def self.migrated?
294
- # Always update with the most recent migration check
295
- GoodJob::DiscreteExecution.reset_column_information
296
- GoodJob::DiscreteExecution.duration_interval_migrated?
291
+ true
297
292
  end
298
293
 
299
294
  ActiveSupport.run_load_hooks(:good_job, self)
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.99.0
4
+ version: 4.0.1
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-07-07 00:00:00.000000000 Z
11
+ date: 2024-07-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activejob
@@ -16,84 +16,84 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 6.0.0
19
+ version: 6.1.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 6.0.0
26
+ version: 6.1.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activerecord
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 6.0.0
33
+ version: 6.1.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 6.0.0
40
+ version: 6.1.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: concurrent-ruby
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 1.0.2
47
+ version: 1.3.1
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: 1.0.2
54
+ version: 1.3.1
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: fugit
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '1.1'
61
+ version: 1.11.0
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '1.1'
68
+ version: 1.11.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: railties
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: 6.0.0
75
+ version: 6.1.0
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: 6.0.0
82
+ version: 6.1.0
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: thor
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: 0.14.1
89
+ version: 1.0.0
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
- version: 0.14.1
96
+ version: 1.0.0
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: capybara
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -255,7 +255,7 @@ files:
255
255
  - app/controllers/good_job/frontends_controller.rb
256
256
  - app/controllers/good_job/jobs_controller.rb
257
257
  - app/controllers/good_job/metrics_controller.rb
258
- - app/controllers/good_job/performances_controller.rb
258
+ - app/controllers/good_job/performance_controller.rb
259
259
  - app/controllers/good_job/processes_controller.rb
260
260
  - app/filters/good_job/base_filter.rb
261
261
  - app/filters/good_job/batches_filter.rb
@@ -307,7 +307,7 @@ files:
307
307
  - app/views/good_job/jobs/_table.erb
308
308
  - app/views/good_job/jobs/index.html.erb
309
309
  - app/views/good_job/jobs/show.html.erb
310
- - app/views/good_job/performances/show.html.erb
310
+ - app/views/good_job/performance/index.html.erb
311
311
  - app/views/good_job/processes/index.html.erb
312
312
  - app/views/good_job/shared/_alert.erb
313
313
  - app/views/good_job/shared/_chart.erb
@@ -351,20 +351,6 @@ files:
351
351
  - lib/generators/good_job/install_generator.rb
352
352
  - lib/generators/good_job/templates/install/migrations/create_good_jobs.rb.erb
353
353
  - lib/generators/good_job/templates/update/migrations/01_create_good_jobs.rb.erb
354
- - lib/generators/good_job/templates/update/migrations/02_create_good_job_settings.rb.erb
355
- - lib/generators/good_job/templates/update/migrations/03_create_index_good_jobs_jobs_on_priority_created_at_when_unfinished.rb.erb
356
- - lib/generators/good_job/templates/update/migrations/04_create_good_job_batches.rb.erb
357
- - lib/generators/good_job/templates/update/migrations/05_create_good_job_executions.rb.erb
358
- - lib/generators/good_job/templates/update/migrations/06_create_good_jobs_error_event.rb.erb
359
- - lib/generators/good_job/templates/update/migrations/07_recreate_good_job_cron_indexes_with_conditional.rb.erb
360
- - lib/generators/good_job/templates/update/migrations/08_create_good_job_labels.rb.erb
361
- - lib/generators/good_job/templates/update/migrations/09_create_good_job_labels_index.rb.erb
362
- - lib/generators/good_job/templates/update/migrations/10_remove_good_job_active_id_index.rb.erb
363
- - lib/generators/good_job/templates/update/migrations/11_create_index_good_job_jobs_for_candidate_lookup.rb.erb
364
- - lib/generators/good_job/templates/update/migrations/12_create_good_job_execution_error_backtrace.rb.erb
365
- - lib/generators/good_job/templates/update/migrations/13_create_good_job_process_lock_ids.rb.erb
366
- - lib/generators/good_job/templates/update/migrations/14_create_good_job_process_lock_indexes.rb.erb
367
- - lib/generators/good_job/templates/update/migrations/15_create_good_job_execution_duration.rb.erb
368
354
  - lib/generators/good_job/update_generator.rb
369
355
  - lib/good_job.rb
370
356
  - lib/good_job/active_job_extensions/batches.rb
@@ -430,14 +416,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
430
416
  requirements:
431
417
  - - ">="
432
418
  - !ruby/object:Gem::Version
433
- version: 2.6.0
419
+ version: 3.0.0
434
420
  required_rubygems_version: !ruby/object:Gem::Requirement
435
421
  requirements:
436
422
  - - ">="
437
423
  - !ruby/object:Gem::Version
438
424
  version: '0'
439
425
  requirements: []
440
- rubygems_version: 3.5.9
426
+ rubygems_version: 3.5.14
441
427
  signing_key:
442
428
  specification_version: 4
443
429
  summary: A multithreaded, Postgres-based ActiveJob backend for Ruby on Rails
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module GoodJob
4
- class PerformancesController < ApplicationController
5
- def show
6
- if GoodJob::DiscreteExecution.duration_interval_migrated?
7
- @performances = GoodJob::DiscreteExecution
8
- .where.not(job_class: nil)
9
- .group(:job_class)
10
- .select("
11
- job_class,
12
- COUNT(*) AS executions_count,
13
- AVG(duration) AS avg_duration,
14
- MIN(duration) AS min_duration,
15
- MAX(duration) AS max_duration
16
- ")
17
- .order("job_class")
18
- else
19
- @needs_upgrade = true
20
- end
21
- end
22
- end
23
- end
@@ -1,50 +0,0 @@
1
- <div class="border-bottom">
2
- <h2 class="pt-3 pb-2"><%= t ".title" %></h2>
3
- </div>
4
-
5
- <% if @needs_upgrade %>
6
- <div class="alert alert-warning">
7
- <%= t "shared.needs_migration" %>
8
- </div>
9
- <% else %>
10
-
11
- <div class="my-3 card">
12
- <div class="list-group list-group-flush text-nowrap" role="table">
13
- <header class="list-group-item bg-body-tertiary">
14
- <div class="row small text-muted text-uppercase align-items-center">
15
- <div class="col-12 col-lg-4"><%= t ".job_class" %></div>
16
- <div class="col-lg-2 d-none d-lg-block"><%= t ".executions" %></div>
17
-
18
- <div class="col-lg-2 d-none d-lg-block"><%= t ".average_duration" %></div>
19
- <div class="col-lg-2 d-none d-lg-block"><%= t ".minimum_duration" %></div>
20
- <div class="col-lg-2 d-none d-lg-block"><%= t ".maximum_duration" %></div>
21
- </div>
22
- </header>
23
-
24
- <% @performances.each do |performance| %>
25
- <div role="row" class="list-group-item py-3">
26
- <div class="row align-items-center">
27
- <div class="col-12 col-lg-4"><%= performance.job_class %></div>
28
- <div class="col-6 col-lg-2 text-wrap">
29
- <div class="d-lg-none small text-muted mt-1"><%= t ".executions" %></div>
30
- <%= performance.executions_count %>
31
- </div>
32
-
33
- <div class="col-6 col-lg-2 text-wrap">
34
- <div class="d-lg-none small text-muted mt-1"><%= t ".average_duration" %></div>
35
- <%= format_duration performance.avg_duration %>
36
- </div>
37
- <div class="col-6 col-lg-2 text-wrap">
38
- <div class="d-lg-none small text-muted mt-1"><%= t ".minimum_duration" %></div>
39
- <%= format_duration performance.min_duration %>
40
- </div>
41
- <div class="col-6 col-lg-2 text-wrap">
42
- <div class="d-lg-none small text-muted mt-1"><%= t ".maximum_duration" %></div>
43
- <%= format_duration performance.max_duration %>
44
- </div>
45
- </div>
46
- </div>
47
- <% end %>
48
- </div>
49
- </div>
50
- <% end %>
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class CreateGoodJobSettings < ActiveRecord::Migration<%= migration_version %>
4
- def change
5
- reversible do |dir|
6
- dir.up do
7
- # Ensure this incremental update migration is idempotent
8
- # with monolithic install migration.
9
- return if connection.table_exists?(:good_job_settings)
10
- end
11
- end
12
-
13
- create_table :good_job_settings, id: :uuid do |t|
14
- t.timestamps
15
- t.text :key
16
- t.jsonb :value
17
- t.index :key, unique: true
18
- end
19
- end
20
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class CreateIndexGoodJobsJobsOnPriorityCreatedAtWhenUnfinished < ActiveRecord::Migration<%= migration_version %>
4
- disable_ddl_transaction!
5
-
6
- def change
7
- reversible do |dir|
8
- dir.up do
9
- # Ensure this incremental update migration is idempotent
10
- # with monolithic install migration.
11
- return if connection.index_name_exists?(:good_jobs, :index_good_jobs_jobs_on_priority_created_at_when_unfinished)
12
- end
13
- end
14
-
15
- add_index :good_jobs, [:priority, :created_at], order: { priority: "DESC NULLS LAST", created_at: :asc },
16
- where: "finished_at IS NULL", name: :index_good_jobs_jobs_on_priority_created_at_when_unfinished,
17
- algorithm: :concurrently
18
- end
19
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class CreateGoodJobBatches < ActiveRecord::Migration<%= migration_version %>
4
- def change
5
- reversible do |dir|
6
- dir.up do
7
- # Ensure this incremental update migration is idempotent
8
- # with monolithic install migration.
9
- return if connection.table_exists?(:good_job_batches)
10
- end
11
- end
12
-
13
- create_table :good_job_batches, id: :uuid do |t|
14
- t.timestamps
15
- t.text :description
16
- t.jsonb :serialized_properties
17
- t.text :on_finish
18
- t.text :on_success
19
- t.text :on_discard
20
- t.text :callback_queue_name
21
- t.integer :callback_priority
22
- t.datetime :enqueued_at
23
- t.datetime :discarded_at
24
- t.datetime :finished_at
25
- end
26
-
27
- change_table :good_jobs do |t|
28
- t.uuid :batch_id
29
- t.uuid :batch_callback_id
30
-
31
- t.index :batch_id, where: "batch_id IS NOT NULL"
32
- t.index :batch_callback_id, where: "batch_callback_id IS NOT NULL"
33
- end
34
- end
35
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class CreateGoodJobExecutions < ActiveRecord::Migration<%= migration_version %>
4
- def change
5
- reversible do |dir|
6
- dir.up do
7
- # Ensure this incremental update migration is idempotent
8
- # with monolithic install migration.
9
- return if connection.table_exists?(:good_job_executions)
10
- end
11
- end
12
-
13
- create_table :good_job_executions, id: :uuid do |t|
14
- t.timestamps
15
-
16
- t.uuid :active_job_id, null: false
17
- t.text :job_class
18
- t.text :queue_name
19
- t.jsonb :serialized_params
20
- t.datetime :scheduled_at
21
- t.datetime :finished_at
22
- t.text :error
23
-
24
- t.index [:active_job_id, :created_at], name: :index_good_job_executions_on_active_job_id_and_created_at
25
- end
26
-
27
- change_table :good_jobs do |t|
28
- t.boolean :is_discrete
29
- t.integer :executions_count
30
- t.text :job_class
31
- end
32
- end
33
- end
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class CreateGoodJobsErrorEvent < ActiveRecord::Migration<%= migration_version %>
4
- def change
5
- reversible do |dir|
6
- dir.up do
7
- # Ensure this incremental update migration is idempotent
8
- # with monolithic install migration.
9
- return if connection.column_exists?(:good_jobs, :error_event)
10
- end
11
- end
12
-
13
- add_column :good_jobs, :error_event, :integer, limit: 2
14
- add_column :good_job_executions, :error_event, :integer, limit: 2
15
- end
16
- end
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class RecreateGoodJobCronIndexesWithConditional < ActiveRecord::Migration<%= migration_version %>
4
- disable_ddl_transaction!
5
-
6
- def change
7
- reversible do |dir|
8
- dir.up do
9
- unless connection.index_name_exists?(:good_jobs, :index_good_jobs_on_cron_key_and_created_at_cond)
10
- add_index :good_jobs, [:cron_key, :created_at], where: "(cron_key IS NOT NULL)",
11
- name: :index_good_jobs_on_cron_key_and_created_at_cond, algorithm: :concurrently
12
- end
13
- unless connection.index_name_exists?(:good_jobs, :index_good_jobs_on_cron_key_and_cron_at_cond)
14
- add_index :good_jobs, [:cron_key, :cron_at], where: "(cron_key IS NOT NULL)", unique: true,
15
- name: :index_good_jobs_on_cron_key_and_cron_at_cond, algorithm: :concurrently
16
- end
17
-
18
- if connection.index_name_exists?(:good_jobs, :index_good_jobs_on_cron_key_and_created_at)
19
- remove_index :good_jobs, name: :index_good_jobs_on_cron_key_and_created_at
20
- end
21
- if connection.index_name_exists?(:good_jobs, :index_good_jobs_on_cron_key_and_cron_at)
22
- remove_index :good_jobs, name: :index_good_jobs_on_cron_key_and_cron_at
23
- end
24
- end
25
-
26
- dir.down do
27
- unless connection.index_name_exists?(:good_jobs, :index_good_jobs_on_cron_key_and_created_at)
28
- add_index :good_jobs, [:cron_key, :created_at],
29
- name: :index_good_jobs_on_cron_key_and_created_at, algorithm: :concurrently
30
- end
31
- unless connection.index_name_exists?(:good_jobs, :index_good_jobs_on_cron_key_and_cron_at)
32
- add_index :good_jobs, [:cron_key, :cron_at], unique: true,
33
- name: :index_good_jobs_on_cron_key_and_cron_at, algorithm: :concurrently
34
- end
35
-
36
- if connection.index_name_exists?(:good_jobs, :index_good_jobs_on_cron_key_and_created_at_cond)
37
- remove_index :good_jobs, name: :index_good_jobs_on_cron_key_and_created_at_cond
38
- end
39
- if connection.index_name_exists?(:good_jobs, :index_good_jobs_on_cron_key_and_cron_at_cond)
40
- remove_index :good_jobs, name: :index_good_jobs_on_cron_key_and_cron_at_cond
41
- end
42
- end
43
- end
44
- end
45
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class CreateGoodJobLabels < ActiveRecord::Migration<%= migration_version %>
4
- def change
5
- reversible do |dir|
6
- dir.up do
7
- # Ensure this incremental update migration is idempotent
8
- # with monolithic install migration.
9
- return if connection.column_exists?(:good_jobs, :labels)
10
- end
11
- end
12
-
13
- add_column :good_jobs, :labels, :text, array: true
14
- end
15
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class CreateGoodJobLabelsIndex < ActiveRecord::Migration<%= migration_version %>
4
- disable_ddl_transaction!
5
-
6
- def change
7
- reversible do |dir|
8
- dir.up do
9
- unless connection.index_name_exists?(:good_jobs, :index_good_jobs_on_labels)
10
- add_index :good_jobs, :labels, using: :gin, where: "(labels IS NOT NULL)",
11
- name: :index_good_jobs_on_labels, algorithm: :concurrently
12
- end
13
- end
14
-
15
- dir.down do
16
- if connection.index_name_exists?(:good_jobs, :index_good_jobs_on_labels)
17
- remove_index :good_jobs, name: :index_good_jobs_on_labels
18
- end
19
- end
20
- end
21
- end
22
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class RemoveGoodJobActiveIdIndex < ActiveRecord::Migration<%= migration_version %>
4
- disable_ddl_transaction!
5
-
6
- def change
7
- reversible do |dir|
8
- dir.up do
9
- if connection.index_name_exists?(:good_jobs, :index_good_jobs_on_active_job_id)
10
- remove_index :good_jobs, name: :index_good_jobs_on_active_job_id
11
- end
12
- end
13
-
14
- dir.down do
15
- unless connection.index_name_exists?(:good_jobs, :index_good_jobs_on_active_job_id)
16
- add_index :good_jobs, :active_job_id, name: :index_good_jobs_on_active_job_id
17
- end
18
- end
19
- end
20
- end
21
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class CreateIndexGoodJobJobsForCandidateLookup < ActiveRecord::Migration<%= migration_version %>
4
- disable_ddl_transaction!
5
-
6
- def change
7
- reversible do |dir|
8
- dir.up do
9
- # Ensure this incremental update migration is idempotent
10
- # with monolithic install migration.
11
- return if connection.index_name_exists?(:good_jobs, :index_good_job_jobs_for_candidate_lookup)
12
- end
13
- end
14
-
15
- add_index :good_jobs, [:priority, :created_at], order: { priority: "ASC NULLS LAST", created_at: :asc },
16
- where: "finished_at IS NULL", name: :index_good_job_jobs_for_candidate_lookup,
17
- algorithm: :concurrently
18
- end
19
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class CreateGoodJobExecutionErrorBacktrace < ActiveRecord::Migration<%= migration_version %>
4
- def change
5
- reversible do |dir|
6
- dir.up do
7
- # Ensure this incremental update migration is idempotent
8
- # with monolithic install migration.
9
- return if connection.column_exists?(:good_job_executions, :error_backtrace)
10
- end
11
- end
12
-
13
- add_column :good_job_executions, :error_backtrace, :text, array: true
14
- end
15
- end