Skip to content

Commit 66a4dfc

Browse files
authored
Merge pull request #575 from gnanou/combined_experiment_performance
Combined experiment performance improvements
2 parents 938de58 + 04bd237 commit 66a4dfc

File tree

5 files changed

+56
-4
lines changed

5 files changed

+56
-4
lines changed

lib/split/experiment.rb

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,12 @@ def save
8181

8282
if new_record?
8383
start unless Split.configuration.start_manually
84+
persist_experiment_configuration
8485
elsif experiment_configuration_has_changed?
8586
reset unless Split.configuration.reset_manually
87+
persist_experiment_configuration
8688
end
8789

88-
persist_experiment_configuration if new_record? || experiment_configuration_has_changed?
89-
9090
redis.hset(experiment_config_key, :resettable, resettable)
9191
redis.hset(experiment_config_key, :algorithm, algorithm.to_s)
9292
self
@@ -144,11 +144,13 @@ def winner
144144
end
145145

146146
def has_winner?
147-
!winner.nil?
147+
return @has_winner if defined? @has_winner
148+
@has_winner = !winner.nil?
148149
end
149150

150151
def winner=(winner_name)
151152
redis.hset(:experiment_winner, name, winner_name.to_s)
153+
@has_winner = true
152154
end
153155

154156
def participant_count
@@ -161,6 +163,7 @@ def control
161163

162164
def reset_winner
163165
redis.hdel(:experiment_winner, name)
166+
@has_winner = false
164167
end
165168

166169
def start

lib/split/user.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,19 @@ class User
88

99
def initialize(context, adapter=nil)
1010
@user = adapter || Split::Persistence.adapter.new(context)
11+
@cleaned_up = false
1112
end
1213

1314
def cleanup_old_experiments!
15+
return if @cleaned_up
1416
keys_without_finished(user.keys).each do |key|
1517
experiment = ExperimentCatalog.find key_without_version(key)
1618
if experiment.nil? || experiment.has_winner? || experiment.start_time.nil?
1719
user.delete key
1820
user.delete Experiment.finished_key(key)
1921
end
2022
end
23+
@cleaned_up = true
2124
end
2225

2326
def max_experiments_reached?(experiment_key)

spec/dashboard_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ def link(color)
142142
it "removes winner" do
143143
post "/reopen?experiment=#{experiment.name}"
144144

145-
expect(experiment).to_not have_winner
145+
expect(Split::ExperimentCatalog.find(experiment.name)).to_not have_winner
146146
end
147147

148148
it "keeps existing stats" do

spec/experiment_spec.rb

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,12 +213,41 @@ def alternative(color)
213213
it "should have no winner initially" do
214214
expect(experiment.winner).to be_nil
215215
end
216+
end
216217

218+
describe 'winner=' do
217219
it "should allow you to specify a winner" do
218220
experiment.save
219221
experiment.winner = 'red'
220222
expect(experiment.winner.name).to eq('red')
221223
end
224+
225+
context 'when has_winner state is memoized' do
226+
before { expect(experiment).to_not have_winner }
227+
228+
it 'should keep has_winner state consistent' do
229+
experiment.winner = 'red'
230+
expect(experiment).to have_winner
231+
end
232+
end
233+
end
234+
235+
describe 'reset_winner' do
236+
before { experiment.winner = 'green' }
237+
238+
it 'should reset the winner' do
239+
experiment.reset_winner
240+
expect(experiment.winner).to be_nil
241+
end
242+
243+
context 'when has_winner state is memoized' do
244+
before { expect(experiment).to have_winner }
245+
246+
it 'should keep has_winner state consistent' do
247+
experiment.reset_winner
248+
expect(experiment).to_not have_winner
249+
end
250+
end
222251
end
223252

224253
describe 'has_winner?' do
@@ -235,6 +264,12 @@ def alternative(color)
235264
expect(experiment).to_not have_winner
236265
end
237266
end
267+
268+
it 'memoizes has_winner state' do
269+
expect(experiment).to receive(:winner).once
270+
expect(experiment).to_not have_winner
271+
expect(experiment).to_not have_winner
272+
end
238273
end
239274

240275
describe 'reset' do

spec/user_spec.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,17 @@
5959
expect(@subject.keys).to include("link_color:finished")
6060
end
6161
end
62+
63+
context 'when already cleaned up' do
64+
before do
65+
@subject.cleanup_old_experiments!
66+
end
67+
68+
it 'does not clean up again' do
69+
expect(@subject).to_not receive(:keys_without_finished)
70+
@subject.cleanup_old_experiments!
71+
end
72+
end
6273
end
6374

6475
context "instantiated with custom adapter" do

0 commit comments

Comments
 (0)