48 lines
1.4 KiB
Ruby
48 lines
1.4 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
module Gitlab
|
||
|
module BackgroundMigration
|
||
|
# Drop rows from security_findings where the uuid is NULL
|
||
|
class DropInvalidSecurityFindings
|
||
|
# rubocop:disable Style/Documentation
|
||
|
class SecurityFinding < ActiveRecord::Base
|
||
|
include ::EachBatch
|
||
|
self.table_name = 'security_findings'
|
||
|
scope :no_uuid, -> { where(uuid: nil) }
|
||
|
end
|
||
|
# rubocop:enable Style/Documentation
|
||
|
|
||
|
PAUSE_SECONDS = 0.1
|
||
|
|
||
|
def perform(start_id, end_id, sub_batch_size)
|
||
|
ranged_query = SecurityFinding
|
||
|
.where(id: start_id..end_id)
|
||
|
.no_uuid
|
||
|
|
||
|
ranged_query.each_batch(of: sub_batch_size) do |sub_batch|
|
||
|
first, last = sub_batch.pluck(Arel.sql('min(id), max(id)')).first
|
||
|
|
||
|
# The query need to be reconstructed because .each_batch modifies the default scope
|
||
|
# See: https://gitlab.com/gitlab-org/gitlab/-/issues/330510
|
||
|
SecurityFinding.unscoped
|
||
|
.where(id: first..last)
|
||
|
.no_uuid
|
||
|
.delete_all
|
||
|
|
||
|
sleep PAUSE_SECONDS
|
||
|
end
|
||
|
|
||
|
mark_job_as_succeeded(start_id, end_id, sub_batch_size)
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def mark_job_as_succeeded(*arguments)
|
||
|
Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded(
|
||
|
self.class.name.demodulize,
|
||
|
arguments
|
||
|
)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|