Skip to content

Commit

Permalink
Add ability to configure whether background migrations should be run …
Browse files Browse the repository at this point in the history
…inline
  • Loading branch information
fatkodima committed Feb 1, 2024
1 parent 39f5994 commit 3446748
Show file tree
Hide file tree
Showing 6 changed files with 73 additions and 2 deletions.
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
## master (unreleased)

- Add ability to configure whether background migrations should be run inline

The previous behavior of running inline in development and test environments is preserved, unless overriden.

```ruby
config.run_background_migrations_inline = -> { Rails.env.local? }
```

## 0.13.1 (2024-01-23)

- Fix calculation of batch ranges for background migration created with explicit ranges
Expand Down
11 changes: 11 additions & 0 deletions docs/configuring.md
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,17 @@ Add to an initializer file:
config.auto_analyze = true
```

### Running background migrations inline

`config.run_background_migrations_inline` can be configured with a proc to decide whether background migrations should be run inline. For convenience defaults to true for development and test environments.

```ruby
# config/initializers/online_migrations.rb
config.run_background_migrations_inline = -> { Rails.env.local? }
```

Set to `nil` to avoid running background migrations inline.

## Schema Sanity

Columns can flip order in `db/schema.rb` when you have multiple developers. One way to prevent this is to [alphabetize them](https://www.pgrs.net/2008/03/12/alphabetize-schema-rb-columns/).
Expand Down
4 changes: 4 additions & 0 deletions lib/generators/online_migrations/templates/initializer.rb.tt
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,10 @@ OnlineMigrations.configure do |config|
# end
# end

# Decide whether background migrations should be run inline.
# Convenient for development and test environments.
config.run_background_migrations_inline = -> { Rails.env.local? }

# ==> Background migrations configuration

# The path where generated background migrations will be placed.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -372,8 +372,8 @@ def perform_action_on_relation_in_background(model_name, conditions, action, upd
def enqueue_background_migration(migration_name, *arguments, **options)
migration = create_background_migration(migration_name, *arguments, **options)

# For convenience in dev/test environments
if Utils.developer_env?
run_inline = OnlineMigrations.config.run_background_migrations_inline
if run_inline && run_inline.call
runner = MigrationRunner.new(migration)
runner.run_all_migration_jobs
end
Expand Down
11 changes: 11 additions & 0 deletions lib/online_migrations/config.rb
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,16 @@ def target_version
#
attr_accessor :verbose_sql_logs

# The proc which decides whether background migrations should be run inline.
# For convenience defaults to true for development and test environments.
#
# @example
# OnlineMigrations.config.run_background_migrations_inline = -> { Rails.env.local? }
#
# @return [Proc]
#
attr_accessor :run_background_migrations_inline

# Configuration object to configure background migrations
#
# @return [BackgroundMigrationsConfig]
Expand Down Expand Up @@ -202,6 +212,7 @@ def initialize
@alphabetize_schema = false
@enabled_checks = @error_messages.keys.index_with({})
@verbose_sql_logs = defined?(Rails.env) && (Rails.env.production? || Rails.env.staging?)
@run_background_migrations_inline = -> { Utils.developer_env? }
end

def lock_retrier=(value)
Expand Down
37 changes: 37 additions & 0 deletions test/schema_statements/misc_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,43 @@ def test_enqueue_background_migration
assert_equal OnlineMigrations.config.background_migrations.batch_size, m.batch_size
end

def test_run_background_migrations_inline_true_in_local
user = User.create!
assert_nil user.admin

@connection.enqueue_background_migration("MakeAllNonAdmins")

m = OnlineMigrations::BackgroundMigrations::Migration.last
assert m.succeeded?
assert_equal false, user.reload.admin
end

def test_run_background_migrations_inline_configured_to_nil
user = User.create!
assert_nil user.admin

OnlineMigrations.config.stub(:run_background_migrations_inline, nil) do
@connection.enqueue_background_migration("MakeAllNonAdmins")
end

m = OnlineMigrations::BackgroundMigrations::Migration.last
assert m.enqueued?
assert_nil user.reload.admin
end

def test_run_background_migrations_inline_configured_to_custom_proc
user = User.create!
assert_nil user.admin

OnlineMigrations.config.stub(:run_background_migrations_inline, -> { false }) do
@connection.enqueue_background_migration("MakeAllNonAdmins")
end

m = OnlineMigrations::BackgroundMigrations::Migration.last
assert m.enqueued?
assert_nil user.reload.admin
end

def test_disable_statement_timeout
prev_value = get_statement_timeout
set_statement_timeout(10)
Expand Down

0 comments on commit 3446748

Please sign in to comment.