ActiveContext: Lazy registration of configured queues
What does this MR do and why?
Problem
There is a static analysis issue in !199853 (comment 2665817994):
this is failing static analysis because, when Rails eager-loaded
Ai::ActiveContext::Queues::Code, it also called the static methods.number_of_shardsand.shard_limit, both of which in turn would call DB queries. The problem it seems is that there are no DB connections set up during Rails eager-loading yetUnfortunately, we can't make these into instance methods because of the way
ActiveContext::Concerns::Queueis setup, see: !199853 (comment 2663283992)
And !199853 (comment 2663283992):
Maybe we need to update
::ActiveContext::Concerns::Queueso it doesn't call#register!on include
Solution
In this change, we remove the base.register! call in the ActiveContext::Concerns::Queue, and instead do the following:
- Introduce an ActiveContext config
queue_classes - Introduce a new method in
ActiveContext::Queues,register_all_queues!for registering all configured queues - When calling
ActiveContext::Queues.raw_queuesorActiveContext::Queues.queues,register_all_queues!is called once - In the
config/initializers/active_context.rb, we configurequeue_classeswith[::Ai::ActiveContext::Queues::Code]
Essentially, we are doing a lazy registration of the configured queues the first time either ActiveContext::Queues.raw_queues or ActiveContext::Queues.queues are called.
References
Related MR: ActiveContext: Allow flexible throughput adjust... (!199853 - merged)
Screenshots or screen recordings
N/A
How to set up and validate locally
1 - Update the number_of_shards in Ai::ActiveContext::Queues::Code
diff --git a/ee/lib/ai/active_context/queues/code.rb b/ee/lib/ai/active_context/queues/code.rb
index 1803f0b066e0..228e1a8d1b04 100644
--- a/ee/lib/ai/active_context/queues/code.rb
+++ b/ee/lib/ai/active_context/queues/code.rb
@@ -9,7 +9,7 @@ class Code
class << self
# having a single shard means we have absolute control over the amount of embeddings we generate in one go
def number_of_shards
- 1
+ 5
end
end
end
2 - Check on the Rails console that ActiveContext is building the correct number of queues
ActiveContext::Queues.raw_queues
=> [#<Ai::ActiveContext::Queues::Code:0x00000001343e8818 @shard=0>,
#<Ai::ActiveContext::Queues::Code:0x00000001343e85e8 @shard=1>,
#<Ai::ActiveContext::Queues::Code:0x00000001343e8598 @shard=2>,
#<Ai::ActiveContext::Queues::Code:0x00000001343e8570 @shard=3>,
#<Ai::ActiveContext::Queues::Code:0x00000001343e8548 @shard=4>]
3 - Check that refs are still being queued correctly
refs_for_queue = (1..10).map(&:to_s)
::Ai::ActiveContext::Collections::Code.track_refs!(routing: "1", hashes: refs_for_queue)
ActiveContext::Queues.all_queued_items
=> {"ai_activecontext_queues:{code}:0:zset"=>
["Ai::ActiveContext::References::Code|2|1|3", "Ai::ActiveContext::References::Code|2|1|4", "Ai::ActiveContext::References::Code|2|1|10"],
"ai_activecontext_queues:{code}:1:zset"=>
["Ai::ActiveContext::References::Code|2|1|5",
"Ai::ActiveContext::References::Code|2|1|6",
"Ai::ActiveContext::References::Code|2|1|7",
"Ai::ActiveContext::References::Code|2|1|8"],
"ai_activecontext_queues:{code}:2:zset"=>["Ai::ActiveContext::References::Code|2|1|1"],
"ai_activecontext_queues:{code}:3:zset"=>["Ai::ActiveContext::References::Code|2|1|2"],
"ai_activecontext_queues:{code}:4:zset"=>["Ai::ActiveContext::References::Code|2|1|9"]}
MR acceptance checklist
Evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.