diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-06-20 14:10:13 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-06-20 14:10:13 +0300 |
commit | 0ea3fcec397b69815975647f5e2aa5fe944a8486 (patch) | |
tree | 7979381b89d26011bcf9bdc989a40fcc2f1ed4ff /app/workers/container_registry | |
parent | 72123183a20411a36d607d70b12d57c484394c8e (diff) |
Add latest changes from gitlab-org/gitlab@15-1-stable-eev15.1.0-rc42
Diffstat (limited to 'app/workers/container_registry')
-rw-r--r-- | app/workers/container_registry/migration/enqueuer_worker.rb | 57 | ||||
-rw-r--r-- | app/workers/container_registry/migration/guard_worker.rb | 31 |
2 files changed, 22 insertions, 66 deletions
diff --git a/app/workers/container_registry/migration/enqueuer_worker.rb b/app/workers/container_registry/migration/enqueuer_worker.rb index a0babb98e82..f3c8dfa63ad 100644 --- a/app/workers/container_registry/migration/enqueuer_worker.rb +++ b/app/workers/container_registry/migration/enqueuer_worker.rb @@ -17,19 +17,8 @@ module ContainerRegistry idempotent! def perform - migration.enqueuer_loop? ? perform_with_loop : perform_without_loop - end - - def self.enqueue_a_job - perform_async - perform_in(7.seconds) if ::ContainerRegistry::Migration.enqueue_twice? - end - - private - - def perform_with_loop try_obtain_lease do - while runnable? && Time.zone.now < loop_deadline && migration.enqueuer_loop? + while runnable? && Time.zone.now < loop_deadline repository_handled = handle_aborted_migration || handle_next_migration # no repository was found: stop the loop @@ -43,40 +32,29 @@ module ContainerRegistry end end - def perform_without_loop - re_enqueue = false - try_obtain_lease do - break unless runnable? - - re_enqueue = handle_aborted_migration || handle_next_migration - end - re_enqueue_if_capacity if re_enqueue + def self.enqueue_a_job + perform_async end + private + def handle_aborted_migration return unless next_aborted_repository - log_on_done(:import_type, 'retry') - log_repository(next_aborted_repository) - next_aborted_repository.retry_aborted_migration true rescue StandardError => e Gitlab::ErrorTracking.log_exception(e, next_aborted_repository_id: next_aborted_repository&.id) - migration.enqueuer_loop? ? false : true + false ensure - log_repository_migration_state(next_aborted_repository) log_repository_info(next_aborted_repository, import_type: 'retry') end def handle_next_migration return unless next_repository - log_on_done(:import_type, 'next') - log_repository(next_repository) - # We return true because the repository was successfully processed (migration_state is changed) return true if tag_count_too_high? return unless next_repository.start_pre_import @@ -88,7 +66,6 @@ module ContainerRegistry false ensure - log_repository_migration_state(next_repository) log_repository_info(next_repository, import_type: 'next') end @@ -97,8 +74,6 @@ module ContainerRegistry return false unless next_repository.tags_count > migration.max_tags_count next_repository.skip_import(reason: :too_many_tags) - log_on_done(:tags_count_too_high, true) - log_on_done(:max_tags_count_setting, migration.max_tags_count) true end @@ -160,7 +135,7 @@ module ContainerRegistry def next_aborted_repository strong_memoize(:next_aborted_repository) do - ContainerRepository.with_migration_state('import_aborted').take # rubocop:disable CodeReuse/ActiveRecord + ContainerRepository.with_migration_state('import_aborted').limit(2)[0] # rubocop:disable CodeReuse/ActiveRecord end end @@ -180,29 +155,11 @@ module ContainerRegistry self.class.enqueue_a_job end - def log_repository(repository) - log_on_done(:container_repository_id, repository&.id) - log_on_done(:container_repository_path, repository&.path) - end - - def log_repository_migration_state(repository) - return unless repository - - log_on_done(:container_repository_migration_state, repository.migration_state) - end - - def log_on_done(key, value) - return if migration.enqueuer_loop? - - log_extra_metadata_on_done(key, value) - end - def log_info(extras) logger.info(structured_payload(extras)) end def log_repository_info(repository, extras = {}) - return unless migration.enqueuer_loop? return unless repository repository_info = { diff --git a/app/workers/container_registry/migration/guard_worker.rb b/app/workers/container_registry/migration/guard_worker.rb index 1111061a89b..ae29106b502 100644 --- a/app/workers/container_registry/migration/guard_worker.rb +++ b/app/workers/container_registry/migration/guard_worker.rb @@ -22,7 +22,7 @@ module ContainerRegistry repositories = ::ContainerRepository.with_stale_migration(step_before_timestamp) .limit(max_capacity) aborts_count = 0 - long_running_migration_ids = [] + long_running_migrations = [] # the #to_a is safe as the amount of entries is limited. # In addition, we're calling #each in the next line and we don't want two different SQL queries for these two lines @@ -32,7 +32,7 @@ module ContainerRegistry 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 + long_running_migrations << repository cancel_long_running_migration(repository) aborts_count += 1 end @@ -44,8 +44,9 @@ module ContainerRegistry log_extra_metadata_on_done(:aborted_stale_migrations_count, aborts_count) - if long_running_migration_ids.any? - log_extra_metadata_on_done(:aborted_long_running_migration_ids, long_running_migration_ids) + if long_running_migrations.any? + log_extra_metadata_on_done(:aborted_long_running_migration_ids, long_running_migrations.map(&:id)) + log_extra_metadata_on_done(:aborted_long_running_migration_paths, long_running_migrations.map(&:path)) end end @@ -64,14 +65,16 @@ module ContainerRegistry end def long_running_migration?(repository) - timeout = long_running_migration_threshold - - if Feature.enabled?(:registry_migration_guard_thresholds) - timeout = if repository.migration_state == 'pre_importing' - migration.pre_import_timeout.seconds - else - migration.import_timeout.seconds - end + timeout = if repository.migration_state == 'pre_importing' + migration.pre_import_timeout.seconds + else + migration.import_timeout.seconds + end + + if repository.migration_state == 'pre_importing' && + Feature.enabled?(:registry_migration_guard_dynamic_pre_import_timeout) && + migration_start_timestamp(repository).before?(timeout.ago) + timeout = migration.dynamic_pre_import_timeout_for(repository) end migration_start_timestamp(repository).before?(timeout.ago) @@ -106,10 +109,6 @@ module ContainerRegistry ::ContainerRegistry::Migration end - def long_running_migration_threshold - @threshold ||= 10.minutes - end - def cancel_long_running_migration(repository) result = repository.migration_cancel |