diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb index 6f06adc1ab22279027fdb75863e571737ad34a39..391daa176c002d8971410a8af4a6350f2f4e142e 100644 --- a/config/initializers/sidekiq.rb +++ b/config/initializers/sidekiq.rb @@ -15,6 +15,9 @@ def load_cron_jobs! end end +# initialise migrated_shards on start-up to catch any malformed SIDEKIQ_MIGRATED_SHARD lists. +Gitlab::SidekiqSharding::Router.migrated_shards + # Custom Queues configuration # # We omit :command_builder since Sidekiq::RedisConnection performs a deep clone using diff --git a/lib/gitlab/sidekiq_sharding/router.rb b/lib/gitlab/sidekiq_sharding/router.rb index 3515f3e1e1fd966afa130f7491cebe5c651a1071..7a724e27b48a498a1133236374d8ca425a7816b6 100644 --- a/lib/gitlab/sidekiq_sharding/router.rb +++ b/lib/gitlab/sidekiq_sharding/router.rb @@ -38,11 +38,16 @@ def route(klass) end end + def migrated_shards + @migrated_shards ||= Set.new(Gitlab::Json.parse(ENV.fetch('SIDEKIQ_MIGRATED_SHARDS', '[]'))) + end + private def route_to(shard_name) # early return if main since we do not want a redundant feature flag check return shard_name if shard_name == Gitlab::Redis::Queues::SIDEKIQ_MAIN_SHARD_INSTANCE_NAME + return shard_name if migrated_shards.include?(shard_name) if shard_name.nil? || Feature.disabled?(:"sidekiq_route_to_#{shard_name}", type: :worker, default_enabled_if_undefined: false) diff --git a/spec/lib/gitlab/sidekiq_sharding/router_spec.rb b/spec/lib/gitlab/sidekiq_sharding/router_spec.rb index a99b73f753ce76de7b106906b56d5edce84f74aa..8dba9f3b675087d30d1f7a1a1f662702953206d2 100644 --- a/spec/lib/gitlab/sidekiq_sharding/router_spec.rb +++ b/spec/lib/gitlab/sidekiq_sharding/router_spec.rb @@ -106,6 +106,25 @@ end end + context 'when shard is migrated' do + before do + stub_env('SIDEKIQ_MIGRATED_SHARDS', "[\"queues_shard_test\"]") + + if described_class.instance_variable_defined?(:@migrated_shards) + described_class.remove_instance_variable(:@migrated_shards) + end + end + + it 'returns shard without checking feature flag' do + expect(Feature).not_to receive(:enabled?) + + name, redis = get_test_shard + + expect(name).to eq('queues_shard_test') + expect(redis).to eq(shard_sidekiq_redis) + end + end + context 'when feature flag is enabled' do before do allow(Feature).to receive(:enabled?)