diff options
Diffstat (limited to 'app/services/loose_foreign_keys/batch_cleaner_service.rb')
-rw-r--r-- | app/services/loose_foreign_keys/batch_cleaner_service.rb | 41 |
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 |