Sha256: 9b9cd77851ef1f1e2ec3830b980be480a816e4d26f8efb97d7b1e8873f5c8101

Contents?: true

Size: 1.81 KB

Versions: 2

Compression:

Stored size: 1.81 KB

Contents

require_relative '../../migration_helpers'

module Gitlab
  module Styles
    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[
              ci_pipelines
              ci_builds
              events
              issues
              merge_request_diff_files
              merge_request_diffs
              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
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
gitlab-styles-1.0.0 lib/gitlab/styles/rubocop/cop/migration/add_column_with_default_to_large_table.rb
gitlab-styles-0.1.0 lib/gitlab/styles/rubocop/cop/migration/add_column_with_default_to_large_table.rb