diff options
author | Robert Speicher <rspeicher@gmail.com> | 2017-04-24 12:48:35 -0500 |
---|---|---|
committer | Robert Speicher <rspeicher@gmail.com> | 2017-04-28 15:55:55 -0500 |
commit | b9fa17d87b534e588d80bb029c7f8cf9f9ff0c45 (patch) | |
tree | 11af18e9ec7f21e687c31b5f3fca414cd19b6892 /rubocop | |
parent | 9c27c90b4a8a9ea179af9588a7dbd2037829905f (diff) | |
download | gitlab-ce-b9fa17d87b534e588d80bb029c7f8cf9f9ff0c45.tar.gz |
Add AddColumnWithDefaultToLargeTable cop
Diffstat (limited to 'rubocop')
-rw-r--r-- | rubocop/cop/migration/add_column_with_default_to_large_table.rb | 51 | ||||
-rw-r--r-- | rubocop/rubocop.rb | 1 |
2 files changed, 52 insertions, 0 deletions
diff --git a/rubocop/cop/migration/add_column_with_default_to_large_table.rb b/rubocop/cop/migration/add_column_with_default_to_large_table.rb new file mode 100644 index 00000000000..2372e6b60ea --- /dev/null +++ b/rubocop/cop/migration/add_column_with_default_to_large_table.rb @@ -0,0 +1,51 @@ +require_relative '../../migration_helpers' + +module RuboCop + module Cop + module Migration + # This cop checks for `add_column_with_default` on a table that's been + # explicitly blacklisted because of its size. + # + # Even though this helper performs the update in batches to avoid + # downtime, using it with tables with millions of rows still causes a + # significant delay in the deploy process and is best avoided. + # + # See https://gitlab.com/gitlab-com/infrastructure/issues/1602 for more + # information. + class AddColumnWithDefaultToLargeTable < RuboCop::Cop::Cop + include MigrationHelpers + + MSG = 'Using `add_column_with_default` on the `%s` table will take a ' \ + 'long time to complete, and should be avoided unless absolutely ' \ + 'necessary'.freeze + + LARGE_TABLES = %i[ + events + issues + merge_requests + namespaces + notes + projects + routes + users + ].freeze + + def_node_matcher :add_column_with_default?, <<~PATTERN + (send nil :add_column_with_default $(sym ...) ...) + PATTERN + + def on_send(node) + return unless in_migration?(node) + + matched = add_column_with_default?(node) + return unless matched + + table = matched.to_a.first + return unless LARGE_TABLES.include?(table) + + add_offense(node, :expression, format(MSG, table)) + end + end + end + end +end diff --git a/rubocop/rubocop.rb b/rubocop/rubocop.rb index cdc0fbfd6a8..4ff204f939e 100644 --- a/rubocop/rubocop.rb +++ b/rubocop/rubocop.rb @@ -1,6 +1,7 @@ require_relative 'cop/custom_error_class' require_relative 'cop/gem_fetcher' require_relative 'cop/migration/add_column' +require_relative 'cop/migration/add_column_with_default_to_large_table' require_relative 'cop/migration/add_concurrent_foreign_key' require_relative 'cop/migration/add_concurrent_index' require_relative 'cop/migration/add_index' |