summaryrefslogtreecommitdiff
path: root/app/services/loose_foreign_keys/batch_cleaner_service.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/loose_foreign_keys/batch_cleaner_service.rb')
-rw-r--r--app/services/loose_foreign_keys/batch_cleaner_service.rb41
1 files changed, 22 insertions, 19 deletions
diff --git a/app/services/loose_foreign_keys/batch_cleaner_service.rb b/app/services/loose_foreign_keys/batch_cleaner_service.rb
index 06c05e8ff54..de52cbba576 100644
--- a/app/services/loose_foreign_keys/batch_cleaner_service.rb
+++ b/app/services/loose_foreign_keys/batch_cleaner_service.rb
@@ -2,11 +2,11 @@
module LooseForeignKeys
class BatchCleanerService
- def initialize(parent_klass:, deleted_parent_records:, modification_tracker: LooseForeignKeys::ModificationTracker.new, models_by_table_name:)
- @parent_klass = parent_klass
+ 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
- @models_by_table_name = models_by_table_name
@deleted_records_counter = Gitlab::Metrics.counter(
:loose_foreign_key_processed_deleted_records,
'The number of processed loose foreign key deleted records'
@@ -14,11 +14,11 @@ module LooseForeignKeys
end
def execute
- parent_klass.loose_foreign_key_definitions.each do |foreign_key_definition|
- run_cleaner_service(foreign_key_definition, with_skip_locked: true)
+ loose_foreign_key_definitions.each do |loose_foreign_key_definition|
+ run_cleaner_service(loose_foreign_key_definition, with_skip_locked: true)
break if modification_tracker.over_limit?
- run_cleaner_service(foreign_key_definition, with_skip_locked: false)
+ run_cleaner_service(loose_foreign_key_definition, with_skip_locked: false)
break if modification_tracker.over_limit?
end
@@ -27,12 +27,12 @@ module LooseForeignKeys
# 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_klass.table_name, db_config_name: LooseForeignKeys::DeletedRecord.connection.pool.db_config.name }, update_count)
+ deleted_records_counter.increment({ table: parent_table, db_config_name: LooseForeignKeys::DeletedRecord.connection.pool.db_config.name }, update_count)
end
private
- attr_reader :parent_klass, :deleted_parent_records, :modification_tracker, :models_by_table_name, :deleted_records_counter
+ attr_reader :parent_table, :loose_foreign_key_definitions, :deleted_parent_records, :modification_tracker, :deleted_records_counter
def record_result(cleaner, result)
if cleaner.async_delete?
@@ -42,19 +42,22 @@ module LooseForeignKeys
end
end
- def run_cleaner_service(foreign_key_definition, with_skip_locked:)
- cleaner = CleanerService.new(
- model: models_by_table_name.fetch(foreign_key_definition.to_table),
- foreign_key_definition: foreign_key_definition,
- deleted_parent_records: deleted_parent_records,
- with_skip_locked: with_skip_locked
- )
+ def run_cleaner_service(loose_foreign_key_definition, with_skip_locked:)
+ base_models_for_gitlab_schema = Gitlab::Database.schemas_to_base_models.fetch(loose_foreign_key_definition.options[:gitlab_schema])
+ base_models_for_gitlab_schema.each do |base_model|
+ cleaner = CleanerService.new(
+ loose_foreign_key_definition: loose_foreign_key_definition,
+ connection: base_model.connection,
+ deleted_parent_records: deleted_parent_records,
+ with_skip_locked: with_skip_locked
+ )
- loop do
- result = cleaner.execute
- record_result(cleaner, result)
+ loop do
+ result = cleaner.execute
+ record_result(cleaner, result)
- break if modification_tracker.over_limit? || result[:affected_rows] == 0
+ break if modification_tracker.over_limit? || result[:affected_rows] == 0
+ end
end
end
end