Skip to content

Commit 92490bc

Browse files
committed
Batch active_experiments winner lookups into one roundtrip
1 parent c9b54c8 commit 92490bc

2 files changed

Lines changed: 31 additions & 3 deletions

File tree

lib/split/user.rb

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,17 @@ def cleanup_old_versions!(experiment)
5555
end
5656

5757
def active_experiments
58+
experiments_by_key = keys_without_finished(user.keys).each_with_object({}) do |key, memo|
59+
memo[key] = Metric.possible_experiments(key_without_version(key))
60+
end
61+
62+
names = experiments_by_key.values.flatten.map(&:name).uniq
63+
winners = names.empty? ? {} : names.zip(Split.redis.hmget(:experiment_winner, *names)).to_h
64+
5865
experiment_pairs = {}
59-
keys_without_finished(user.keys).each do |key|
60-
Metric.possible_experiments(key_without_version(key)).each do |experiment|
61-
if !experiment.has_winner?
66+
experiments_by_key.each do |key, experiments|
67+
experiments.each do |experiment|
68+
unless winners[experiment.name]
6269
experiment_pairs[key_without_version(key)] = user[key]
6370
end
6471
end

spec/user_spec.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,27 @@
118118
end
119119
end
120120

121+
context "#active_experiments" do
122+
let(:user_keys) { { "with_winner" => "red", "active" => "red" } }
123+
124+
before do
125+
with_winner = Split::ExperimentCatalog.find_or_create("with_winner", "red", "blue")
126+
with_winner.start
127+
with_winner.winner = "red"
128+
129+
Split::ExperimentCatalog.find_or_create("active", "red", "blue").start
130+
end
131+
132+
it "excludes experiments that already have a winner" do
133+
expect(@subject.active_experiments).to eq("active" => "red")
134+
end
135+
136+
it "fetches every experiment's winner in a single call" do
137+
expect(Split.redis).to receive(:hmget).with(:experiment_winner, any_args).once.and_call_original
138+
@subject.active_experiments
139+
end
140+
end
141+
121142
context "allows user to be loaded from adapter" do
122143
it "loads user from adapter (RedisAdapter)" do
123144
user = Split::Persistence::RedisAdapter.new(nil, 112233)

0 commit comments

Comments
 (0)