Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/workers/container_registry/migration/guard_worker_spec.rb')
-rw-r--r--spec/workers/container_registry/migration/guard_worker_spec.rb106
1 files changed, 75 insertions, 31 deletions
diff --git a/spec/workers/container_registry/migration/guard_worker_spec.rb b/spec/workers/container_registry/migration/guard_worker_spec.rb
index c52a3fc5d54..d2bcfef2f5b 100644
--- a/spec/workers/container_registry/migration/guard_worker_spec.rb
+++ b/spec/workers/container_registry/migration/guard_worker_spec.rb
@@ -37,6 +37,7 @@ RSpec.describe ContainerRegistry::Migration::GuardWorker, :aggregate_failures do
expect(worker).to receive(:log_extra_metadata_on_done).with(:stale_migrations_count, 1)
expect(worker).to receive(:log_extra_metadata_on_done).with(:aborted_stale_migrations_count, 1)
expect(worker).to receive(:log_extra_metadata_on_done).with(:aborted_long_running_migration_ids, [stale_migration.id])
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:aborted_long_running_migration_paths, [stale_migration.path])
expect(ContainerRegistry::Migration).to receive(timeout).and_call_original
expect { subject }
@@ -44,19 +45,6 @@ RSpec.describe ContainerRegistry::Migration::GuardWorker, :aggregate_failures do
.and change { stale_migration.reload.migration_state }.to('import_aborted')
.and not_change { ongoing_migration.migration_state }
end
-
- context 'registry_migration_guard_thresholds feature flag disabled' do
- before do
- stub_feature_flags(registry_migration_guard_thresholds: false)
- end
-
- it 'falls back on the hardcoded value' do
- expect(ContainerRegistry::Migration).not_to receive(:pre_import_timeout)
-
- expect { subject }
- .to change { stale_migration.reload.migration_state }.to('import_aborted')
- end
- end
end
context 'migration is canceled' do
@@ -75,6 +63,7 @@ RSpec.describe ContainerRegistry::Migration::GuardWorker, :aggregate_failures do
expect(worker).to receive(:log_extra_metadata_on_done).with(:stale_migrations_count, 1)
expect(worker).to receive(:log_extra_metadata_on_done).with(:aborted_stale_migrations_count, 1)
expect(worker).to receive(:log_extra_metadata_on_done).with(:aborted_long_running_migration_ids, [stale_migration.id])
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:aborted_long_running_migration_paths, [stale_migration.path])
expect(ContainerRegistry::Migration).to receive(timeout).and_call_original
expect { subject }
@@ -83,19 +72,6 @@ RSpec.describe ContainerRegistry::Migration::GuardWorker, :aggregate_failures do
expect(stale_migration.reload.migration_state).to eq('import_skipped')
expect(stale_migration.reload.migration_skipped_reason).to eq('migration_canceled')
end
-
- context 'registry_migration_guard_thresholds feature flag disabled' do
- before do
- stub_feature_flags(registry_migration_guard_thresholds: false)
- end
-
- it 'falls back on the hardcoded value' do
- expect(ContainerRegistry::Migration).not_to receive(timeout)
-
- expect { subject }
- .to change { stale_migration.reload.migration_state }.to('import_skipped')
- end
- end
end
context 'when the retry limit has not been reached' do
@@ -132,16 +108,15 @@ RSpec.describe ContainerRegistry::Migration::GuardWorker, :aggregate_failures do
end
context 'with pre_importing stale migrations' do
- let(:ongoing_migration) { create(:container_repository, :pre_importing) }
- let(:stale_migration) { create(:container_repository, :pre_importing, migration_pre_import_started_at: 11.minutes.ago) }
+ let_it_be(:ongoing_migration) { create(:container_repository, :pre_importing) }
+ let_it_be(:stale_migration) { create(:container_repository, :pre_importing, migration_pre_import_started_at: 11.minutes.ago) }
+
let(:import_status) { 'test' }
before do
allow_next_instance_of(ContainerRegistry::GitlabApiClient) do |client|
allow(client).to receive(:import_status).and_return(import_status)
end
-
- stub_application_setting(container_registry_pre_import_timeout: 10.minutes.to_i)
end
it 'will abort the migration' do
@@ -161,7 +136,76 @@ RSpec.describe ContainerRegistry::Migration::GuardWorker, :aggregate_failures do
context 'the client returns pre_import_in_progress' do
let(:import_status) { 'pre_import_in_progress' }
- it_behaves_like 'handling long running migrations', timeout: :pre_import_timeout
+ shared_examples 'not aborting the stale migration' do
+ it 'will not abort the migration' do
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:stale_migrations_count, 1)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:aborted_stale_migrations_count, 0)
+
+ expect { subject }
+ .to not_change(pre_importing_migrations, :count)
+ .and not_change(pre_import_done_migrations, :count)
+ .and not_change(importing_migrations, :count)
+ .and not_change(import_done_migrations, :count)
+ .and not_change(import_aborted_migrations, :count)
+ .and not_change { stale_migration.reload.migration_state }
+ .and not_change { ongoing_migration.migration_state }
+ end
+ end
+
+ context 'not long running' do
+ before do
+ stub_application_setting(container_registry_pre_import_timeout: 12.minutes.to_i)
+ end
+
+ it_behaves_like 'not aborting the stale migration'
+ end
+
+ context 'long running' do
+ before do
+ stub_application_setting(container_registry_pre_import_timeout: 9.minutes.to_i)
+ end
+
+ context 'with registry_migration_guard_dynamic_pre_import_timeout enabled' do
+ before do
+ stub_application_setting(container_registry_pre_import_tags_rate: 1)
+ end
+
+ context 'below the dynamic threshold' do
+ before do
+ allow_next_found_instance_of(ContainerRepository) do |repository|
+ allow(repository).to receive(:tags_count).and_return(11.minutes.to_i + 100)
+ end
+ end
+
+ it_behaves_like 'not aborting the stale migration'
+ end
+
+ context 'above the dynamic threshold' do
+ let(:tags) do
+ Array.new(11.minutes.to_i - 100) { |i| "tag#{i}" }
+ end
+
+ before do
+ # We can't allow_next_found_instance_of because the shared example
+ # 'handling long running migrations' is already using that.
+ # Instead, here we're going to stub the ContainerRegistry::Client instance.
+ allow_next_instance_of(ContainerRegistry::Client) do |client|
+ allow(client).to receive(:repository_tags).and_return({ 'tags' => tags })
+ end
+ end
+
+ it_behaves_like 'handling long running migrations', timeout: :pre_import_timeout
+ end
+ end
+
+ context 'with registry_migration_guard_dynamic_pre_import_timeout disabled' do
+ before do
+ stub_feature_flags(registry_migration_guard_dynamic_pre_import_timeout: false)
+ end
+
+ it_behaves_like 'handling long running migrations', timeout: :pre_import_timeout
+ end
+ end
end
end