summaryrefslogtreecommitdiff
path: root/lib/gitlab/background_migration/drop_invalid_security_findings.rb
blob: 87551bb1b1ec10bfccdf261bff3356cc01006957 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 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