Class: LooseForeignKeys::BatchCleanerService

Inherits:
Object
  • Object
show all
Defined in:
app/services/loose_foreign_keys/batch_cleaner_service.rb

Constant Summary collapse

CLEANUP_ATTEMPTS_BEFORE_RESCHEDULE =
3
CONSUME_AFTER_RESCHEDULE =
5.minutes

Instance Method Summary collapse

Constructor Details

#initialize(parent_table:, loose_foreign_key_definitions:, deleted_parent_records:, modification_tracker: LooseForeignKeys::ModificationTracker.new) ⇒ BatchCleanerService

Returns a new instance of BatchCleanerService.



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'app/services/loose_foreign_keys/batch_cleaner_service.rb', line 8

def initialize(parent_table:, loose_foreign_key_definitions:, deleted_parent_records:, modification_tracker: LooseForeignKeys::ModificationTracker.new)
  @parent_table = parent_table
  @loose_foreign_key_definitions = loose_foreign_key_definitions
  @deleted_parent_records = deleted_parent_records
  @modification_tracker = modification_tracker
  @deleted_records_counter = Gitlab::Metrics.counter(
    :loose_foreign_key_processed_deleted_records,
    'The number of processed loose foreign key deleted records'
  )
  @deleted_records_rescheduled_count = Gitlab::Metrics.counter(
    :loose_foreign_key_rescheduled_deleted_records,
    'The number of rescheduled loose foreign key deleted records'
  )
  @deleted_records_incremented_count = Gitlab::Metrics.counter(
    :loose_foreign_key_incremented_deleted_records,
    'The number of loose foreign key deleted records with incremented cleanup_attempts'
  )
end

Instance Method Details

#executeObject



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'app/services/loose_foreign_keys/batch_cleaner_service.rb', line 27

def execute
  loose_foreign_key_definitions.each do |loose_foreign_key_definition|
    run_cleaner_service(loose_foreign_key_definition, with_skip_locked: true)

    if modification_tracker.over_limit?
      handle_over_limit
      break
    end

    run_cleaner_service(loose_foreign_key_definition, with_skip_locked: false)

    if modification_tracker.over_limit?
      handle_over_limit
      break
    end
  end

  return if modification_tracker.over_limit?

  # At this point, all associations are cleaned up, we can update the status of the parent records
  update_count = LooseForeignKeys::DeletedRecord.mark_records_processed(deleted_parent_records)

  deleted_records_counter.increment({ table: parent_table, db_config_name: db_config_name }, update_count)
end