diff --git a/lib/gitlab/sidekiq_versioning.rb b/lib/gitlab/sidekiq_versioning.rb index 28c9714f82f3138ed0cff5b6e938dac626ff1c8f..8ca37698f41983d40df250577a0897979938295a 100644 --- a/lib/gitlab/sidekiq_versioning.rb +++ b/lib/gitlab/sidekiq_versioning.rb @@ -6,11 +6,13 @@ def self.install! # The Sidekiq client API always adds the queue to the Sidekiq queue # list, but mail_room and gitlab-shell do not. This is only necessary # for monitoring. - queues = SidekiqConfig.worker_queues - + queues = ::Gitlab::SidekiqConfig.routing_queues if queues.any? Sidekiq.redis do |conn| - conn.sadd('queues', queues) + conn.multi do |multi| + multi.del('queues') + multi.sadd('queues', queues) + end end end rescue ::Redis::BaseError, SocketError, Errno::ENOENT, Errno::EADDRNOTAVAIL, Errno::EAFNOSUPPORT, Errno::ECONNRESET, Errno::ECONNREFUSED diff --git a/spec/lib/gitlab/sidekiq_versioning_spec.rb b/spec/lib/gitlab/sidekiq_versioning_spec.rb index bdbba04e0c0fb84a11da119d500ec3b0c5204d3f..9501339ee30fc6f26d93c50f4acb42d122f24759 100644 --- a/spec/lib/gitlab/sidekiq_versioning_spec.rb +++ b/spec/lib/gitlab/sidekiq_versioning_spec.rb @@ -4,16 +4,40 @@ RSpec.describe Gitlab::SidekiqVersioning, :clean_gitlab_redis_queues do before do - allow(Gitlab::SidekiqConfig).to receive(:worker_queues).and_return(%w[foo bar]) + allow(Gitlab::SidekiqConfig).to receive(:routing_queues).and_return(%w[foo bar]) end + subject(:queues) { Sidekiq::Queue.all.map(&:name) } + describe '.install!' do it 'registers all versionless and versioned queues with Redis' do described_class.install! - queues = Sidekiq::Queue.all.map(&:name) expect(queues).to include('foo') expect(queues).to include('bar') end + + context 'when some queues outside routing rules were already registered' do + before do + Sidekiq.redis do |conn| + conn.sadd('queues', 'a', 'b', 'c', 'foo') + end + end + + it 'removes the queues outside routing rules' do + described_class.install! + + expect(queues).not_to include('a') + expect(queues).not_to include('b') + expect(queues).not_to include('c') + end + + it 'registers all queues in routing rules' do + described_class.install! + + expect(queues).to include('foo') + expect(queues).to include('bar') + end + end end end