diff options
Diffstat (limited to 'app/workers/projects/after_import_worker.rb')
-rw-r--r-- | app/workers/projects/after_import_worker.rb | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/app/workers/projects/after_import_worker.rb b/app/workers/projects/after_import_worker.rb new file mode 100644 index 00000000000..06211b2d991 --- /dev/null +++ b/app/workers/projects/after_import_worker.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +module Projects + class AfterImportWorker + include ApplicationWorker + + RESERVED_REF_PREFIXES = Repository::RESERVED_REFS_NAMES.map { |n| File.join('refs', n, '/') } + + data_consistency :always + idempotent! + urgency :low + feature_category :importers + + def perform(project_id) + @project = Project.find(project_id) + + service = Repositories::HousekeepingService.new(@project) + + service.execute do + import_failure_service.with_retry(action: 'delete_all_refs') do + repository.delete_all_refs_except(RESERVED_REF_PREFIXES) + end + end + + # Right now we don't actually have a way to know if a project + # import actually changed, so we increment the counter to avoid + # causing GC to run every time. + service.increment! + rescue Repositories::HousekeepingService::LeaseTaken => e + Gitlab::Import::Logger.info( + message: 'Project housekeeping failed', + project_full_path: @project.full_path, + project_id: @project.id, + 'error.message' => e.message + ) + end + + private + + def import_failure_service + Gitlab::ImportExport::ImportFailureService.new(@project) + end + + def repository + @project.repository + end + end +end |