50 lines
1.4 KiB
Ruby
50 lines
1.4 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
class BackfillCadenceIdForBoardsScopedToIteration < Gitlab::Database::Migration[1.0]
|
||
|
disable_ddl_transaction!
|
||
|
|
||
|
BATCH_SIZE = 1000
|
||
|
DELAY = 2.minutes.to_i
|
||
|
MIGRATION = 'BackfillIterationCadenceIdForBoards'
|
||
|
|
||
|
class MigrationBoard < ApplicationRecord
|
||
|
include EachBatch
|
||
|
|
||
|
self.table_name = 'boards'
|
||
|
end
|
||
|
|
||
|
def up
|
||
|
schedule_backfill_group_boards
|
||
|
schedule_backfill_project_boards
|
||
|
end
|
||
|
|
||
|
def down
|
||
|
MigrationBoard.where.not(iteration_cadence_id: nil).each_batch(of: BATCH_SIZE) do |batch, index|
|
||
|
range = batch.pluck(Arel.sql('MIN(id)'), Arel.sql('MAX(id)')).first
|
||
|
delay = index * DELAY
|
||
|
|
||
|
migrate_in(delay, MIGRATION, ['none', 'down', *range])
|
||
|
end
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def schedule_backfill_project_boards
|
||
|
MigrationBoard.where(iteration_id: -4).where.not(project_id: nil).where(iteration_cadence_id: nil).each_batch(of: BATCH_SIZE) do |batch, index|
|
||
|
range = batch.pluck(Arel.sql('MIN(id)'), Arel.sql('MAX(id)')).first
|
||
|
delay = index * DELAY
|
||
|
|
||
|
migrate_in(delay, MIGRATION, ['project', 'up', *range])
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def schedule_backfill_group_boards
|
||
|
MigrationBoard.where(iteration_id: -4).where.not(group_id: nil).where(iteration_cadence_id: nil).each_batch(of: BATCH_SIZE) do |batch, index|
|
||
|
range = batch.pluck(Arel.sql('MIN(id)'), Arel.sql('MAX(id)')).first
|
||
|
delay = index * DELAY
|
||
|
|
||
|
migrate_in(delay, MIGRATION, ['group', 'up', *range])
|
||
|
end
|
||
|
end
|
||
|
end
|