Commit eb086a4b authored by Sean McGivern's avatar Sean McGivern

Disallow methods that copy data on large tables

{change_column_type,rename_column}_concurrently both copy data from one column
to another during a migration, which should not be done on GitLab.com. Instead,
we should use background migrations.
parent c0f0ccf2
...@@ -34,8 +34,15 @@ module RuboCop ...@@ -34,8 +34,15 @@ module RuboCop
users users
].freeze ].freeze
BATCH_UPDATE_METHODS = %w[
:add_column_with_default
:change_column_type_concurrently
:rename_column_concurrently
:update_column_in_batches
].join(' ').freeze
def_node_matcher :batch_update?, <<~PATTERN def_node_matcher :batch_update?, <<~PATTERN
(send nil? ${:add_column_with_default :update_column_in_batches} $(sym ...) ...) (send nil? ${#{BATCH_UPDATE_METHODS}} $(sym ...) ...)
PATTERN PATTERN
def on_send(node) def on_send(node)
......
...@@ -32,6 +32,14 @@ describe RuboCop::Cop::Migration::UpdateLargeTable do ...@@ -32,6 +32,14 @@ describe RuboCop::Cop::Migration::UpdateLargeTable do
include_examples 'large tables', 'add_column_with_default' include_examples 'large tables', 'add_column_with_default'
end end
context 'for the change_column_type_concurrently method' do
include_examples 'large tables', 'change_column_type_concurrently'
end
context 'for the rename_column_concurrently method' do
include_examples 'large tables', 'rename_column_concurrently'
end
context 'for the update_column_in_batches method' do context 'for the update_column_in_batches method' do
include_examples 'large tables', 'update_column_in_batches' include_examples 'large tables', 'update_column_in_batches'
end end
...@@ -60,6 +68,18 @@ describe RuboCop::Cop::Migration::UpdateLargeTable do ...@@ -60,6 +68,18 @@ describe RuboCop::Cop::Migration::UpdateLargeTable do
expect(cop.offenses).to be_empty expect(cop.offenses).to be_empty
end end
it 'registers no offense for change_column_type_concurrently' do
inspect_source("change_column_type_concurrently :#{table}, :column, default: true")
expect(cop.offenses).to be_empty
end
it 'registers no offense for update_column_in_batches' do
inspect_source("rename_column_concurrently :#{table}, :column, default: true")
expect(cop.offenses).to be_empty
end
it 'registers no offense for update_column_in_batches' do it 'registers no offense for update_column_in_batches' do
inspect_source("add_column_with_default :#{table}, :column, default: true") inspect_source("add_column_with_default :#{table}, :column, default: true")
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment