7f30bb9c29
This adds a minimum interval to BackgroundMigrationWorker, ensuring background migrations of the same class only run once every 5 minutes. This prevents a thundering herd problem where scheduled migrations all run at once due to their delays having been expired (e.g. as the result of a queue being paused for a long time). If a job was recently executed it's rescheduled with a delay that equals the remaining time of the job's lease. This means that if the lease expires in two minutes we only need to wait two minutes, instead of five. Fixes https://gitlab.com/gitlab-org/gitlab-ce/issues/41624
32 lines
807 B
Ruby
32 lines
807 B
Ruby
require 'spec_helper'
|
|
|
|
describe BackgroundMigrationWorker, :sidekiq, :clean_gitlab_redis_shared_state do
|
|
let(:worker) { described_class.new }
|
|
|
|
describe '.perform' do
|
|
it 'performs a background migration' do
|
|
expect(Gitlab::BackgroundMigration)
|
|
.to receive(:perform)
|
|
.with('Foo', [10, 20])
|
|
|
|
worker.perform('Foo', [10, 20])
|
|
end
|
|
|
|
it 'reschedules a migration if it was performed recently' do
|
|
expect(worker)
|
|
.to receive(:always_perform?)
|
|
.and_return(false)
|
|
|
|
worker.lease_for('Foo').try_obtain
|
|
|
|
expect(Gitlab::BackgroundMigration)
|
|
.not_to receive(:perform)
|
|
|
|
expect(described_class)
|
|
.to receive(:perform_in)
|
|
.with(a_kind_of(Numeric), 'Foo', [10, 20])
|
|
|
|
worker.perform('Foo', [10, 20])
|
|
end
|
|
end
|
|
end
|