online_migrations 0.26.0 → 0.27.1

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 (51) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/docs/0.27-upgrade.md +24 -0
  4. data/docs/background_data_migrations.md +200 -101
  5. data/docs/background_schema_migrations.md +2 -2
  6. data/lib/generators/online_migrations/{background_migration_generator.rb → data_migration_generator.rb} +4 -4
  7. data/lib/generators/online_migrations/templates/change_background_data_migrations.rb.tt +34 -0
  8. data/lib/generators/online_migrations/templates/{background_data_migration.rb.tt → data_migration.rb.tt} +8 -9
  9. data/lib/generators/online_migrations/templates/initializer.rb.tt +19 -25
  10. data/lib/generators/online_migrations/templates/install_migration.rb.tt +9 -40
  11. data/lib/generators/online_migrations/upgrade_generator.rb +16 -8
  12. data/lib/online_migrations/active_record_batch_enumerator.rb +8 -0
  13. data/lib/online_migrations/background_data_migrations/backfill_column.rb +50 -0
  14. data/lib/online_migrations/background_data_migrations/config.rb +62 -0
  15. data/lib/online_migrations/{background_migrations → background_data_migrations}/copy_column.rb +15 -28
  16. data/lib/online_migrations/{background_migrations → background_data_migrations}/delete_associated_records.rb +9 -5
  17. data/lib/online_migrations/{background_migrations → background_data_migrations}/delete_orphaned_records.rb +5 -9
  18. data/lib/online_migrations/background_data_migrations/migration.rb +312 -0
  19. data/lib/online_migrations/{background_migrations → background_data_migrations}/migration_helpers.rb +72 -61
  20. data/lib/online_migrations/background_data_migrations/migration_job.rb +160 -0
  21. data/lib/online_migrations/background_data_migrations/migration_status_validator.rb +65 -0
  22. data/lib/online_migrations/{background_migrations → background_data_migrations}/perform_action_on_relation.rb +5 -5
  23. data/lib/online_migrations/{background_migrations → background_data_migrations}/reset_counters.rb +5 -5
  24. data/lib/online_migrations/background_data_migrations/scheduler.rb +78 -0
  25. data/lib/online_migrations/background_data_migrations/ticker.rb +62 -0
  26. data/lib/online_migrations/background_schema_migrations/config.rb +2 -2
  27. data/lib/online_migrations/background_schema_migrations/migration.rb +51 -123
  28. data/lib/online_migrations/background_schema_migrations/migration_helpers.rb +25 -46
  29. data/lib/online_migrations/background_schema_migrations/migration_runner.rb +43 -97
  30. data/lib/online_migrations/background_schema_migrations/scheduler.rb +2 -2
  31. data/lib/online_migrations/change_column_type_helpers.rb +17 -4
  32. data/lib/online_migrations/config.rb +4 -4
  33. data/lib/online_migrations/data_migration.rb +127 -0
  34. data/lib/online_migrations/error_messages.rb +2 -0
  35. data/lib/online_migrations/lock_retrier.rb +5 -2
  36. data/lib/online_migrations/schema_statements.rb +1 -1
  37. data/lib/online_migrations/shard_aware.rb +44 -0
  38. data/lib/online_migrations/version.rb +1 -1
  39. data/lib/online_migrations.rb +18 -11
  40. metadata +22 -21
  41. data/lib/online_migrations/background_migration.rb +0 -64
  42. data/lib/online_migrations/background_migrations/backfill_column.rb +0 -54
  43. data/lib/online_migrations/background_migrations/background_migration_class_validator.rb +0 -29
  44. data/lib/online_migrations/background_migrations/config.rb +0 -74
  45. data/lib/online_migrations/background_migrations/migration.rb +0 -329
  46. data/lib/online_migrations/background_migrations/migration_job.rb +0 -109
  47. data/lib/online_migrations/background_migrations/migration_job_runner.rb +0 -66
  48. data/lib/online_migrations/background_migrations/migration_job_status_validator.rb +0 -29
  49. data/lib/online_migrations/background_migrations/migration_runner.rb +0 -161
  50. data/lib/online_migrations/background_migrations/migration_status_validator.rb +0 -48
  51. data/lib/online_migrations/background_migrations/scheduler.rb +0 -42
@@ -1,48 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module OnlineMigrations
4
- module BackgroundMigrations
5
- # @private
6
- class MigrationStatusValidator < ActiveModel::Validator
7
- VALID_STATUS_TRANSITIONS = {
8
- # enqueued -> running occurs when the migration starts performing.
9
- # enqueued -> paused occurs when the migration is paused before starting.
10
- "enqueued" => ["running", "paused", "cancelled"],
11
- # running -> paused occurs when a user pauses the migration as
12
- # it's performing.
13
- # running -> finishing occurs when a user manually finishes the migration.
14
- # running -> succeeded occurs when the migration completes successfully.
15
- # running -> failed occurs when the migration raises an exception when running.
16
- "running" => [
17
- "paused",
18
- "finishing",
19
- "succeeded",
20
- "failed",
21
- "cancelled",
22
- ],
23
- # finishing -> succeeded occurs when the migration completes successfully.
24
- # finishing -> failed occurs when the migration raises an exception when running.
25
- "finishing" => ["succeeded", "failed", "cancelled"],
26
- # paused -> running occurs when the migration is resumed after being paused.
27
- "paused" => ["running", "cancelled"],
28
- # failed -> enqueued occurs when the failed migration jobs are retried after being failed.
29
- # failed -> running occurs when the failed migration is retried.
30
- "failed" => ["enqueued", "running", "cancelled"],
31
- }
32
-
33
- def validate(record)
34
- return if !record.status_changed?
35
-
36
- previous_status, new_status = record.status_change
37
- valid_new_statuses = VALID_STATUS_TRANSITIONS.fetch(previous_status, [])
38
-
39
- if !valid_new_statuses.include?(new_status)
40
- record.errors.add(
41
- :status,
42
- "cannot transition background migration from status #{previous_status} to #{new_status}"
43
- )
44
- end
45
- end
46
- end
47
- end
48
- end
@@ -1,42 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module OnlineMigrations
4
- module BackgroundMigrations
5
- # Class responsible for scheduling background migrations.
6
- #
7
- # It selects a single runnable background migration and runs it one step (one batch) at a time.
8
- # A migration is considered runnable if it is not completed and the time interval between
9
- # successive runs has passed.
10
- #
11
- # Scheduler should be configured to run periodically, for example, via cron.
12
- #
13
- # @example Run via whenever
14
- # # add this to schedule.rb
15
- # every 1.minute do
16
- # runner "OnlineMigrations.run_background_data_migrations"
17
- # end
18
- #
19
- # @example Run via whenever (specific shard)
20
- # every 1.minute do
21
- # runner "OnlineMigrations.run_background_data_migrations(shard: :shard_two)"
22
- # end
23
- #
24
- class Scheduler
25
- def self.run(**options)
26
- new.run(**options)
27
- end
28
-
29
- # Runs Scheduler
30
- def run(**options)
31
- active_migrations = Migration.runnable.active.queue_order
32
- active_migrations = active_migrations.where(shard: options[:shard]) if options.key?(:shard)
33
- runnable_migration = active_migrations.select(&:interval_elapsed?).first
34
-
35
- if runnable_migration
36
- runner = MigrationRunner.new(runnable_migration)
37
- runner.run_migration_job
38
- end
39
- end
40
- end
41
- end
42
- end