68 lines
1.9 KiB
Ruby
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
|