46 lines
1.7 KiB
Ruby
46 lines
1.7 KiB
Ruby
# frozen_string_literal: true
|
|
# rubocop:disable Metrics/AbcSize
|
|
# rubocop:disable Style/Documentation
|
|
|
|
module Gitlab
|
|
module BackgroundMigration
|
|
class DeleteDiffFiles
|
|
def perform(merge_request_diff_id)
|
|
merge_request_diff = MergeRequestDiff.find_by(id: merge_request_diff_id)
|
|
|
|
return unless merge_request_diff
|
|
return unless should_delete_diff_files?(merge_request_diff)
|
|
|
|
MergeRequestDiff.transaction do
|
|
merge_request_diff.update_column(:state, 'without_files')
|
|
|
|
# explain (analyze, buffers) when deleting 453 diff files:
|
|
#
|
|
# Delete on merge_request_diff_files (cost=0.57..8487.35 rows=4846 width=6) (actual time=43.265..43.265 rows=0 loops=1)
|
|
# Buffers: shared hit=2043 read=259 dirtied=254
|
|
# -> Index Scan using index_merge_request_diff_files_on_mr_diff_id_and_order on merge_request_diff_files (cost=0.57..8487.35 rows=4846 width=6) (actu
|
|
# al time=0.466..26.317 rows=453 loops=1)
|
|
# Index Cond: (merge_request_diff_id = 463448)
|
|
# Buffers: shared hit=17 read=84
|
|
# Planning time: 0.107 ms
|
|
# Execution time: 43.287 ms
|
|
#
|
|
MergeRequestDiffFile.where(merge_request_diff_id: merge_request_diff.id).delete_all
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def should_delete_diff_files?(merge_request_diff)
|
|
return false if merge_request_diff.state == 'without_files'
|
|
|
|
merge_request = merge_request_diff.merge_request
|
|
|
|
return false unless merge_request.state == 'merged'
|
|
return false if merge_request_diff.id == merge_request.latest_merge_request_diff_id
|
|
|
|
true
|
|
end
|
|
end
|
|
end
|
|
end
|