debian-mirror-gitlab/spec/migrations/adjust_task_note_rename_background_migration_values_spec.rb
2023-03-04 22:38:38 +05:30

144 lines
4.5 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
require_migration!
RSpec.describe AdjustTaskNoteRenameBackgroundMigrationValues, :migration, feature_category: :team_planning do
let(:finished_status) { 3 }
let(:failed_status) { described_class::MIGRATION_FAILED_STATUS }
let(:active_status) { described_class::MIGRATION_ACTIVE_STATUS }
shared_examples 'task note migration with failing batches' do
it 'updates batch sizes and resets failed batches' do
migration = create_background_migration(status: initial_status)
batches = []
batches << create_failed_batched_job(migration)
batches << create_failed_batched_job(migration)
migrate!
expect(described_class::JOB_CLASS_NAME).to have_scheduled_batched_migration(
table_name: :system_note_metadata,
column_name: :id,
interval: 2.minutes,
batch_size: described_class::NEW_BATCH_SIZE,
max_batch_size: 20_000,
sub_batch_size: described_class::NEW_SUB_BATCH_SIZE
)
expect(migration.reload.status).to eq(active_status)
updated_batches = batches.map { |b| b.reload.attributes.slice('attempts', 'sub_batch_size') }
expect(updated_batches).to all(eq("attempts" => 0, "sub_batch_size" => 10))
end
end
describe '#up' do
context 'when migration was already finished' do
it 'does not update batch sizes' do
create_background_migration(status: finished_status)
migrate!
expect(described_class::JOB_CLASS_NAME).to have_scheduled_batched_migration(
table_name: :system_note_metadata,
column_name: :id,
interval: 2.minutes,
batch_size: described_class::OLD_BATCH_SIZE,
max_batch_size: 20_000,
sub_batch_size: described_class::OLD_SUB_BATCH_SIZE
)
end
end
context 'when the migration had failing batches' do
context 'when migration had a failed status' do
it_behaves_like 'task note migration with failing batches' do
let(:initial_status) { failed_status }
end
it 'updates started_at timestamp' do
migration = create_background_migration(status: failed_status)
now = Time.zone.now
travel_to now do
migrate!
migration.reload
end
expect(migration.started_at).to be_like_time(now)
end
end
context 'when migration had an active status' do
it_behaves_like 'task note migration with failing batches' do
let(:initial_status) { active_status }
end
it 'does not update started_at timestamp' do
migration = create_background_migration(status: active_status)
original_time = migration.started_at
migrate!
migration.reload
expect(migration.started_at).to be_like_time(original_time)
end
end
end
end
describe '#down' do
it 'reverts to old batch sizes' do
create_background_migration(status: finished_status)
migrate!
schema_migrate_down!
expect(described_class::JOB_CLASS_NAME).to have_scheduled_batched_migration(
table_name: :system_note_metadata,
column_name: :id,
interval: 2.minutes,
batch_size: described_class::OLD_BATCH_SIZE,
max_batch_size: 20_000,
sub_batch_size: described_class::OLD_SUB_BATCH_SIZE
)
end
end
def create_failed_batched_job(migration)
table(:batched_background_migration_jobs).create!(
batched_background_migration_id: migration.id,
status: described_class::JOB_FAILED_STATUS,
min_value: 1,
max_value: 10,
attempts: 3,
batch_size: described_class::OLD_BATCH_SIZE,
sub_batch_size: described_class::OLD_SUB_BATCH_SIZE
)
end
def create_background_migration(status:)
migrations_table = table(:batched_background_migrations)
# make sure we only have on migration with that job class name in the specs
migrations_table.where(job_class_name: described_class::JOB_CLASS_NAME).delete_all
migrations_table.create!(
job_class_name: described_class::JOB_CLASS_NAME,
status: status,
max_value: 10,
max_batch_size: 20_000,
batch_size: described_class::OLD_BATCH_SIZE,
sub_batch_size: described_class::OLD_SUB_BATCH_SIZE,
interval: 2.minutes,
table_name: :system_note_metadata,
column_name: :id,
total_tuple_count: 100_000,
pause_ms: 100,
gitlab_schema: :gitlab_main,
job_arguments: [],
started_at: 2.days.ago
)
end
end