Class: Gitlab::Styles::Rubocop::Cop::Migration::AddColumnWithDefaultToLargeTable

Inherits:
RuboCop::Cop::Cop
  • Object
show all
Includes:
MigrationHelpers
Defined in:
lib/gitlab/styles/rubocop/cop/migration/add_column_with_default_to_large_table.rb

Overview

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 gitlab.com/gitlab-com/infrastructure/issues/1602 for more information.

Constant Summary collapse

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[
  ci_pipelines
  ci_builds
  events
  issues
  merge_request_diff_files
  merge_request_diffs
  merge_requests
  namespaces
  notes
  projects
  routes
  users
].freeze

Instance Method Summary collapse

Methods included from MigrationHelpers

#in_migration?

Instance Method Details

#on_send(node) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
# File 'lib/gitlab/styles/rubocop/cop/migration/add_column_with_default_to_large_table.rb', line 43

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