@@ -15,13 +15,25 @@ def initialize(context, adapter = nil)
1515
1616 def cleanup_old_experiments!
1717 return if @cleaned_up
18- keys_without_finished ( user . keys ) . each do |key |
19- experiment = Experiment . new key_without_version ( key )
20- if experiment . nil? || experiment . has_winner? || experiment . start_time . nil?
21- user . delete key
22- user . delete Experiment . finished_key ( key )
18+ keys = keys_without_finished ( user . keys )
19+ names = keys . map { |key | key_without_version ( key ) }
20+
21+ unless names . empty?
22+ winners , start_times = Split . redis . pipelined do |pipe |
23+ pipe . hmget ( :experiment_winner , *names )
24+ pipe . hmget ( :experiment_start_times , *names )
25+ end
26+
27+ keys . each_with_index do |key , index |
28+ has_winner = !winners [ index ] . nil?
29+ not_started = start_times [ index ] . nil?
30+ if has_winner || not_started
31+ user . delete key
32+ user . delete Experiment . finished_key ( key )
33+ end
2334 end
2435 end
36+
2537 @cleaned_up = true
2638 end
2739
@@ -43,10 +55,17 @@ def cleanup_old_versions!(experiment)
4355 end
4456
4557 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+
4665 experiment_pairs = { }
47- keys_without_finished ( user . keys ) . each do |key |
48- Metric . possible_experiments ( key_without_version ( key ) ) . each do |experiment |
49- if ! experiment . has_winner?
66+ experiments_by_key . each do |key , experiments |
67+ experiments . each do |experiment |
68+ unless winners [ experiment . name ]
5069 experiment_pairs [ key_without_version ( key ) ] = user [ key ]
5170 end
5271 end
0 commit comments