diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-04-20 13:00:54 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-04-20 13:00:54 +0300 |
commit | 3cccd102ba543e02725d247893729e5c73b38295 (patch) | |
tree | f36a04ec38517f5deaaacb5acc7d949688d1e187 /app/workers/container_registry/migration/guard_worker.rb | |
parent | 205943281328046ef7b4528031b90fbda70c75ac (diff) |
Add latest changes from gitlab-org/gitlab@14-10-stable-eev14.10.0-rc42
Diffstat (limited to 'app/workers/container_registry/migration/guard_worker.rb')
-rw-r--r-- | app/workers/container_registry/migration/guard_worker.rb | 52 |
1 files changed, 33 insertions, 19 deletions
diff --git a/app/workers/container_registry/migration/guard_worker.rb b/app/workers/container_registry/migration/guard_worker.rb index 77ae111c1cb..bab6b8c2a72 100644 --- a/app/workers/container_registry/migration/guard_worker.rb +++ b/app/workers/container_registry/migration/guard_worker.rb @@ -29,46 +29,45 @@ module ContainerRegistry log_extra_metadata_on_done(:stale_migrations_count, repositories.to_a.size) repositories.each do |repository| - if abortable?(repository) + if actively_importing?(repository) + # if a repository is actively importing but not yet long_running, do nothing + if long_running_migration?(repository) + long_running_migration_ids << repository.id + cancel_long_running_migration(repository) + aborts_count += 1 + end + else repository.abort_import aborts_count += 1 - else - long_running_migration_ids << repository.id if long_running_migration?(repository) end end log_extra_metadata_on_done(:aborted_stale_migrations_count, aborts_count) if long_running_migration_ids.any? - log_extra_metadata_on_done(:long_running_stale_migration_container_repository_ids, long_running_migration_ids) + log_extra_metadata_on_done(:aborted_long_running_migration_ids, long_running_migration_ids) end end private - # This can ping the Container Registry API. - # We loop on a set of repositories to calls this function (see #perform) - # In the worst case scenario, we have a n+1 API calls situation here. - # - # This is reasonable because the maximum amount of repositories looped - # on is `25`. See ::ContainerRegistry::Migration.capacity. - # - # TODO We can remove this n+1 situation by having a Container Registry API - # endpoint that accepts multiple repository paths at once. This is issue + # A repository is actively_importing if it has an importing migration state + # and that state matches the state in the registry + # TODO We can have an API call n+1 situation here. It can be solved when the + # endpoint accepts multiple repository paths at once. This is issue # https://gitlab.com/gitlab-org/container-registry/-/issues/582 - def abortable?(repository) - # early return to save one Container Registry API request - return true unless repository.importing? || repository.pre_importing? - return true unless external_migration_in_progress?(repository) + def actively_importing?(repository) + return false unless repository.importing? || repository.pre_importing? + return false unless external_state_matches_migration_state?(repository) - false + true end def long_running_migration?(repository) migration_start_timestamp(repository).before?(long_running_migration_threshold) end - def external_migration_in_progress?(repository) + def external_state_matches_migration_state?(repository) status = repository.external_import_status (status == 'pre_import_in_progress' && repository.pre_importing?) || @@ -96,6 +95,21 @@ module ContainerRegistry def long_running_migration_threshold @threshold ||= 30.minutes.ago end + + def cancel_long_running_migration(repository) + result = repository.migration_cancel + + case result[:status] + when :ok + repository.skip_import(reason: :migration_canceled) + when :bad_request + repository.reconcile_import_status(result[:state]) do + repository.abort_import + end + else + repository.abort_import + end + end end end end |