45 lines
1.3 KiB
Ruby
45 lines
1.3 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
# rubocop:disable Style/Documentation
|
||
|
|
||
|
module Gitlab
|
||
|
module BackgroundMigration
|
||
|
class ScheduleDiffFilesDeletion
|
||
|
class MergeRequestDiff < ActiveRecord::Base
|
||
|
self.table_name = 'merge_request_diffs'
|
||
|
|
||
|
belongs_to :merge_request
|
||
|
|
||
|
include EachBatch
|
||
|
end
|
||
|
|
||
|
DIFF_BATCH_SIZE = 5_000
|
||
|
INTERVAL = 5.minutes
|
||
|
MIGRATION = 'DeleteDiffFiles'
|
||
|
|
||
|
def perform
|
||
|
diffs = MergeRequestDiff
|
||
|
.from("(#{diffs_collection.to_sql}) merge_request_diffs")
|
||
|
.where('merge_request_diffs.id != merge_request_diffs.latest_merge_request_diff_id')
|
||
|
.select(:id)
|
||
|
|
||
|
diffs.each_batch(of: DIFF_BATCH_SIZE) do |relation, index|
|
||
|
ids = relation.pluck(:id)
|
||
|
|
||
|
BackgroundMigrationWorker.perform_in(index * INTERVAL, MIGRATION, [ids])
|
||
|
end
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def diffs_collection
|
||
|
MergeRequestDiff
|
||
|
.joins(:merge_request)
|
||
|
.where("merge_requests.state = 'merged'")
|
||
|
.where('merge_requests.latest_merge_request_diff_id IS NOT NULL')
|
||
|
.where("merge_request_diffs.state NOT IN ('without_files', 'empty')")
|
||
|
.select('merge_requests.latest_merge_request_diff_id, merge_request_diffs.id')
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|