Commit 825b9ea1 authored by Mikołaj Wawrzyniak's avatar Mikołaj Wawrzyniak

Merge branch '331815-fix-batched-migrations-old-format-job-arguments' into 'master'

Fix batched migrations using legacy job arguments

See merge request gitlab-org/gitlab!64159
parents f7121c45 d10601ba
# frozen_string_literal: true
class FixBatchedMigrationsOldFormatJobArguments < ActiveRecord::Migration[6.1]
class BatchedMigration < ActiveRecord::Base
self.table_name = 'batched_background_migrations'
end
def up
# rubocop:disable Style/WordArray
[
['events', 'id', ['id', 'id_convert_to_bigint'], [['id'], ['id_convert_to_bigint']]],
['push_event_payloads', 'event_id', ['event_id', 'event_id_convert_to_bigint'], [['event_id'], ['event_id_convert_to_bigint']]]
].each do |table_name, column_name, legacy_job_arguments, current_job_arguments|
base_scope = BatchedMigration
.where(job_class_name: 'CopyColumnUsingBackgroundMigrationJob', table_name: table_name, column_name: column_name)
# rubocop:enable Style/WordArray
# rubocop:disable Rails/WhereEquals
base_scope
.where('job_arguments = ?', legacy_job_arguments.to_json)
.where('NOT EXISTS (?)', base_scope.select('1').where('job_arguments = ?', current_job_arguments.to_json))
.update_all(job_arguments: current_job_arguments)
# rubocop:enable Rails/WhereEquals
end
end
def down
# No-op, there is no way to know were the existing record migrated from
# legacy job arguments, or were using the current format from the start.
# There is no reason to go back anyway.
end
end
205336e95a6e3c9fa8c56fa67e66ef3023ba8c6cd4e6f3599160b74b3fbfaa3c
\ No newline at end of file
# frozen_string_literal: true
require 'spec_helper'
require_migration!
# rubocop:disable Style/WordArray
RSpec.describe FixBatchedMigrationsOldFormatJobArguments do
let(:batched_background_migrations) { table(:batched_background_migrations) }
context 'when migrations with legacy job arguments exists' do
it 'updates job arguments to current format' do
legacy_events_migration = create_batched_migration('events', 'id', ['id', 'id_convert_to_bigint'])
legacy_push_event_payloads_migration = create_batched_migration('push_event_payloads', 'event_id', ['event_id', 'event_id_convert_to_bigint'])
migrate!
expect(legacy_events_migration.reload.job_arguments).to eq([['id'], ['id_convert_to_bigint']])
expect(legacy_push_event_payloads_migration.reload.job_arguments).to eq([['event_id'], ['event_id_convert_to_bigint']])
end
end
context 'when only migrations with current job arguments exists' do
it 'updates nothing' do
events_migration = create_batched_migration('events', 'id', [['id'], ['id_convert_to_bigint']])
push_event_payloads_migration = create_batched_migration('push_event_payloads', 'event_id', [['event_id'], ['event_id_convert_to_bigint']])
migrate!
expect(events_migration.reload.job_arguments).to eq([['id'], ['id_convert_to_bigint']])
expect(push_event_payloads_migration.reload.job_arguments).to eq([['event_id'], ['event_id_convert_to_bigint']])
end
end
context 'when migrations with both legacy and current job arguments exist' do
it 'updates nothing' do
legacy_events_migration = create_batched_migration('events', 'id', ['id', 'id_convert_to_bigint'])
events_migration = create_batched_migration('events', 'id', [['id'], ['id_convert_to_bigint']])
legacy_push_event_payloads_migration = create_batched_migration('push_event_payloads', 'event_id', ['event_id', 'event_id_convert_to_bigint'])
push_event_payloads_migration = create_batched_migration('push_event_payloads', 'event_id', [['event_id'], ['event_id_convert_to_bigint']])
migrate!
expect(legacy_events_migration.reload.job_arguments).to eq(['id', 'id_convert_to_bigint'])
expect(events_migration.reload.job_arguments).to eq([['id'], ['id_convert_to_bigint']])
expect(legacy_push_event_payloads_migration.reload.job_arguments).to eq(['event_id', 'event_id_convert_to_bigint'])
expect(push_event_payloads_migration.reload.job_arguments).to eq([['event_id'], ['event_id_convert_to_bigint']])
end
end
def create_batched_migration(table_name, column_name, job_arguments)
batched_background_migrations.create!(
max_value: 10,
batch_size: 10,
sub_batch_size: 10,
interval: 1,
job_class_name: 'CopyColumnUsingBackgroundMigrationJob',
table_name: table_name,
column_name: column_name,
job_arguments: job_arguments
)
end
end
# rubocop:enable Style/WordArray
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment