gitlab-org--gitlab-foss/db/post_migrate/20191030223057_backfill_ver...

68 lines
1.9 KiB
Ruby

# frozen_string_literal: true
class BackfillVersionAuthorAndCreatedAt < ActiveRecord::Migration[5.2]
DOWNTIME = false
MIGRATION = 'BackfillVersionDataFromGitaly'.freeze
BATCH_SIZE = 500
disable_ddl_transaction!
class Project < ActiveRecord::Base
self.table_name = 'projects'
self.inheritance_column = :_type_disabled
end
class Issue < ActiveRecord::Base
self.table_name = 'issues'
self.inheritance_column = :_type_disabled
end
class Version < ActiveRecord::Base
include EachBatch
self.table_name = 'design_management_versions'
self.inheritance_column = :_type_disabled
# Returns unique issue ids of versions that are not in projects
# that are pending deletion.
scope :with_unique_issue_ids, -> do
versions = Version.arel_table
issues = Issue.arel_table
projects = Project.arel_table
Version.select(versions[:issue_id]).where(
versions[:author_id].eq(nil).or(
versions[:created_at].eq(nil)
).and(
issues[:project_id].not_in(
projects.project(projects[:id]).where(projects[:pending_delete].eq(true))
)
)
).joins(
versions.join(issues).on(
issues[:id].eq(versions[:issue_id])
).join_sources
).distinct
end
end
# This migration will make around ~1300 UPDATE queries on GitLab.com,
# one per design_management_versions record as the migration will update
# each record individually.
#
# It will make around 870 Gitaly `ListCommitsByOid` requests on GitLab.com.
# One for every unique issue with design_management_versions records.
def up
return unless Gitlab.ee? # no-op for CE
Version.with_unique_issue_ids.each_batch(of: BATCH_SIZE) do |versions, index|
jobs = versions.map { |version| [MIGRATION, [version.issue_id]] }
BackgroundMigrationWorker.bulk_perform_async(jobs)
end
end
def down
# no-op
end
end