44 lines
1.1 KiB
Ruby
44 lines
1.1 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
class ScheduleRecalculateProjectAuthorizations < ActiveRecord::Migration[5.1]
|
||
|
include Gitlab::Database::MigrationHelpers
|
||
|
|
||
|
DOWNTIME = false
|
||
|
|
||
|
MIGRATION = 'RecalculateProjectAuthorizations'
|
||
|
BATCH_SIZE = 2_500
|
||
|
DELAY_INTERVAL = 2.minutes.to_i
|
||
|
|
||
|
disable_ddl_transaction!
|
||
|
|
||
|
class Namespace < ActiveRecord::Base
|
||
|
include ::EachBatch
|
||
|
|
||
|
self.table_name = 'namespaces'
|
||
|
end
|
||
|
|
||
|
class ProjectAuthorization < ActiveRecord::Base
|
||
|
include ::EachBatch
|
||
|
|
||
|
self.table_name = 'project_authorizations'
|
||
|
end
|
||
|
|
||
|
def up
|
||
|
say "Scheduling #{MIGRATION} jobs"
|
||
|
|
||
|
max_group_id = Namespace.where(type: 'Group').maximum(:id)
|
||
|
project_authorizations = ProjectAuthorization.where('project_id <= ?', max_group_id)
|
||
|
.select(:user_id)
|
||
|
.distinct
|
||
|
|
||
|
project_authorizations.each_batch(of: BATCH_SIZE, column: :user_id) do |authorizations, index|
|
||
|
delay = index * DELAY_INTERVAL
|
||
|
user_ids = authorizations.map(&:user_id)
|
||
|
BackgroundMigrationWorker.perform_in(delay, MIGRATION, [user_ids])
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def down
|
||
|
end
|
||
|
end
|