diff options
Diffstat (limited to 'app/services/projects/schedule_bulk_repository_shard_moves_service.rb')
-rw-r--r-- | app/services/projects/schedule_bulk_repository_shard_moves_service.rb | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/app/services/projects/schedule_bulk_repository_shard_moves_service.rb b/app/services/projects/schedule_bulk_repository_shard_moves_service.rb new file mode 100644 index 00000000000..dd49910207f --- /dev/null +++ b/app/services/projects/schedule_bulk_repository_shard_moves_service.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +module Projects + # Tries to schedule a move for every project with repositories on the source shard + class ScheduleBulkRepositoryShardMovesService + include BaseServiceUtility + + def execute(source_storage_name, destination_storage_name = nil) + shard = Shard.find_by_name!(source_storage_name) + + ProjectRepository.for_shard(shard).each_batch(column: :project_id) do |relation| + Project.id_in(relation.select(:project_id)).each do |project| + project.with_lock do + next if project.repository_storage != source_storage_name + + storage_move = project.repository_storage_moves.build( + source_storage_name: source_storage_name, + destination_storage_name: destination_storage_name + ) + + unless storage_move.schedule + log_info("Project #{project.full_path} (#{project.id}) was skipped: #{storage_move.errors.full_messages.to_sentence}") + end + end + end + end + + success + end + + def self.enqueue(source_storage_name, destination_storage_name = nil) + ::ProjectScheduleBulkRepositoryShardMovesWorker.perform_async(source_storage_name, destination_storage_name) + end + end +end |