d8be981466
add_column_with_default is implemented in terms of update_column_in_batches, but update_column_in_batches can be used independently. Neither of these should be used on the specified large tables, because they will cause issues on large instances like GitLab.com. This also ignores the cop for all existing migrations, renaming AddColumnWithDefaultToLargeTable where appropriate.
43 lines
1.6 KiB
Ruby
43 lines
1.6 KiB
Ruby
# rubocop:disable Migration/UpdateLargeTable
|
|
# rubocop:disable Migration/UpdateColumnInBatches
|
|
class MigrateAssignees < ActiveRecord::Migration
|
|
include Gitlab::Database::MigrationHelpers
|
|
|
|
# Set this constant to true if this migration requires downtime.
|
|
DOWNTIME = false
|
|
|
|
# When a migration requires downtime you **must** uncomment the following
|
|
# constant and define a short and easy to understand explanation as to why the
|
|
# migration requires downtime.
|
|
# DOWNTIME_REASON = ''
|
|
|
|
# When using the methods "add_concurrent_index" or "add_column_with_default"
|
|
# you must disable the use of transactions as these methods can not run in an
|
|
# existing transaction. When using "add_concurrent_index" make sure that this
|
|
# method is the _only_ method called in the migration, any other changes
|
|
# should go in a separate migration. This ensures that upon failure _only_ the
|
|
# index creation fails and can be retried or reverted easily.
|
|
#
|
|
# To disable transactions uncomment the following line and remove these
|
|
# comments:
|
|
disable_ddl_transaction!
|
|
|
|
def up
|
|
# Optimisation: this accounts for most of the invalid assignee IDs on GitLab.com
|
|
update_column_in_batches(:issues, :assignee_id, nil) do |table, query|
|
|
query.where(table[:assignee_id].eq(0))
|
|
end
|
|
|
|
users = Arel::Table.new(:users)
|
|
|
|
update_column_in_batches(:issues, :assignee_id, nil) do |table, query|
|
|
query.where(table[:assignee_id].not_eq(nil)\
|
|
.and(
|
|
users.project("true").where(users[:id].eq(table[:assignee_id])).exists.not
|
|
))
|
|
end
|
|
end
|
|
|
|
def down
|
|
end
|
|
end
|