79 lines
1.8 KiB
Ruby
79 lines
1.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# Sync remaining records for issues/merge_requests tables where state_id
|
|
# is still null.
|
|
# For more information check: https://gitlab.com/gitlab-org/gitlab/issues/26823
|
|
# It creates a temporary index before performing the UPDATES to sync values.
|
|
#
|
|
# In 09-11-2019 we have the following numbers for records with state_id == nil:
|
|
#
|
|
# 1348 issues - default batch size for each update 67
|
|
# 10247 merge requests - default batch size for each update 511
|
|
|
|
class SyncIssuablesStateId < ActiveRecord::Migration[5.2]
|
|
include Gitlab::Database::MigrationHelpers
|
|
|
|
DOWNTIME = false
|
|
|
|
disable_ddl_transaction!
|
|
|
|
def up
|
|
%i(issues merge_requests).each do |table|
|
|
temp_index_name = index_name_for(table)
|
|
|
|
add_concurrent_index(
|
|
table,
|
|
'id',
|
|
name: temp_index_name,
|
|
where: 'state_id IS NULL'
|
|
)
|
|
|
|
update_value = update_condition_for(table)
|
|
|
|
update_column_in_batches(table, :state_id, update_value) do |table, query|
|
|
query.where(table[:state_id].eq(nil))
|
|
end
|
|
ensure
|
|
remove_concurrent_index_by_name(table, temp_index_name)
|
|
end
|
|
end
|
|
|
|
def down
|
|
# NO OP
|
|
end
|
|
|
|
def update_condition_for(table)
|
|
value_expresson =
|
|
if table == :issues
|
|
issues_state_id_condition
|
|
else
|
|
merge_requests_state_id_condition
|
|
end
|
|
|
|
Arel.sql(value_expresson)
|
|
end
|
|
|
|
def index_name_for(table)
|
|
"idx_tmp_on_#{table}_where_state_id_is_null"
|
|
end
|
|
|
|
def issues_state_id_condition
|
|
<<~SQL
|
|
CASE state
|
|
WHEN 'opened' THEN 1
|
|
WHEN 'closed' THEN 2
|
|
END
|
|
SQL
|
|
end
|
|
|
|
def merge_requests_state_id_condition
|
|
<<~SQL
|
|
CASE state
|
|
WHEN 'opened' THEN 1
|
|
WHEN 'closed' THEN 2
|
|
WHEN 'merged' THEN 3
|
|
WHEN 'locked' THEN 4
|
|
END
|
|
SQL
|
|
end
|
|
end
|