Skip to content

Commit 97e6448

Browse files
authored
Merge pull request #379 from splitio/retries-configurations
add configs and update api clients
2 parents daaadf4 + e1da666 commit 97e6448

9 files changed

Lines changed: 91 additions & 23 deletions

File tree

lib/splitclient-rb/cache/fetchers/segment_fetcher.rb

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,19 @@ def call
3030
def fetch_segments_if_not_exists(names, cache_control_headers = false)
3131
names.each do |name|
3232
change_number = @segments_repository.get_change_number(name)
33-
34-
fetch_segment(name, cache_control_headers) if change_number == -1
33+
34+
if change_number == -1
35+
fetch_options = { cache_control_headers: cache_control_headers, till: nil }
36+
fetch_segment(name, fetch_options) if change_number == -1
37+
end
3538
end
3639
rescue StandardError => error
3740
@config.log_found_exception(__method__.to_s, error)
3841
end
3942

40-
def fetch_segment(name, cache_control_headers = false)
43+
def fetch_segment(name, fetch_options = { cache_control_headers: false, till: nil })
4144
@semaphore.synchronize do
42-
segments_api.fetch_segments_by_names([name], cache_control_headers)
45+
segments_api.fetch_segments_by_names([name], fetch_options)
4346
end
4447
rescue StandardError => error
4548
@config.log_found_exception(__method__.to_s, error)

lib/splitclient-rb/cache/fetchers/split_fetcher.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ def call
2727
end
2828
end
2929

30-
def fetch_splits(cache_control_headers = false)
30+
def fetch_splits(fetch_options = { cache_control_headers: false, till: nil })
3131
@semaphore.synchronize do
32-
data = splits_since(@splits_repository.get_change_number, cache_control_headers)
32+
data = splits_since(@splits_repository.get_change_number, fetch_options)
3333

3434
data[:splits] && data[:splits].each do |split|
3535
add_split_unless_archived(split)
@@ -68,8 +68,8 @@ def splits_thread
6868
end
6969
end
7070

71-
def splits_since(since, cache_control_headers = false)
72-
splits_api.since(since, cache_control_headers)
71+
def splits_since(since, fetch_options = { cache_control_headers: false, till: nil })
72+
splits_api.since(since, fetch_options)
7373
end
7474

7575
def add_split_unless_archived(split)

lib/splitclient-rb/engine/api/segments.rb

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ def initialize(api_key, segments_repository, config, telemetry_runtime_producer)
1111
@telemetry_runtime_producer = telemetry_runtime_producer
1212
end
1313

14-
def fetch_segments_by_names(names, cache_control_headers = false)
14+
def fetch_segments_by_names(names, fetch_options = { cache_control_headers: false, till: nil })
1515
return if names.nil? || names.empty?
1616

1717
names.each do |name|
1818
since = @segments_repository.get_change_number(name)
1919
loop do
20-
segment = fetch_segment_changes(name, since, cache_control_headers)
20+
segment = fetch_segment_changes(name, since, fetch_options)
2121
@segments_repository.add_to_segment(segment)
2222

2323
@config.split_logger.log_if_debug("Segment #{name} fetched before: #{since}, \
@@ -32,9 +32,12 @@ def fetch_segments_by_names(names, cache_control_headers = false)
3232

3333
private
3434

35-
def fetch_segment_changes(name, since, cache_control_headers = false)
35+
def fetch_segment_changes(name, since, fetch_options = { cache_control_headers: false, till: nil })
3636
start = Time.now
37-
response = get_api("#{@config.base_uri}/segmentChanges/#{name}", @api_key, { since: since }, cache_control_headers)
37+
38+
params = { since: since }
39+
params[:till] = fetch_options[:till] unless fetch_options[:till].nil?
40+
response = get_api("#{@config.base_uri}/segmentChanges/#{name}", @api_key, params, fetch_options[:cache_control_headers])
3841

3942
if response.success?
4043
segment = JSON.parse(response.body, symbolize_names: true)

lib/splitclient-rb/engine/api/splits.rb

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ def initialize(api_key, config, telemetry_runtime_producer)
1010
@telemetry_runtime_producer = telemetry_runtime_producer
1111
end
1212

13-
def since(since, cache_control_headers = false)
13+
def since(since, fetch_options = { cache_control_headers: false, till: nil })
1414
start = Time.now
15-
16-
response = get_api("#{@config.base_uri}/splitChanges", @api_key, { since: since }, cache_control_headers)
15+
16+
params = { since: since }
17+
params[:till] = fetch_options[:till] unless fetch_options[:till].nil?
18+
response = get_api("#{@config.base_uri}/splitChanges", @api_key, params, fetch_options[:cache_control_headers])
1719
if response.success?
1820
result = splits_with_segment_names(response.body)
1921

lib/splitclient-rb/engine/synchronizer.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ class Synchronizer
66
include SplitIoClient::Cache::Fetchers
77
include SplitIoClient::Cache::Senders
88

9-
FORCE_CACHE_CONTROL_HEADERS = true
10-
119
def initialize(
1210
repositories,
1311
api_key,
@@ -55,12 +53,14 @@ def stop_periodic_fetch
5553
end
5654

5755
def fetch_splits
58-
segment_names = @split_fetcher.fetch_splits(FORCE_CACHE_CONTROL_HEADERS)
59-
@segment_fetcher.fetch_segments_if_not_exists(segment_names, FORCE_CACHE_CONTROL_HEADERS) unless segment_names.empty?
56+
fetch_options = { cache_control_headers: true, till: nil }
57+
segment_names = @split_fetcher.fetch_splits(fetch_options)
58+
@segment_fetcher.fetch_segments_if_not_exists(segment_names, true) unless segment_names.empty?
6059
end
6160

6261
def fetch_segment(name)
63-
@segment_fetcher.fetch_segment(name, FORCE_CACHE_CONTROL_HEADERS)
62+
fetch_options = { cache_control_headers: true, till: nil }
63+
@segment_fetcher.fetch_segment(name, fetch_options)
6464
end
6565

6666
private

lib/splitclient-rb/split_config.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,9 @@ def initialize(opts = {})
113113

114114
@sdk_start_time = Time.now
115115

116+
@on_demand_fetch_retry_delay_ms = SplitConfig.default_on_demand_fetch_retry_delay_ms
117+
@on_demand_fetch_max_retries = SplitConfig.default_on_demand_fetch_max_retries
118+
116119
startup_log
117120
end
118121

@@ -278,6 +281,17 @@ def initialize(opts = {})
278281

279282
attr_accessor :sdk_start_time
280283

284+
attr_accessor :on_demand_fetch_retry_delay_ms
285+
attr_accessor :on_demand_fetch_max_retries
286+
287+
def self.default_on_demand_fetch_retry_delay_ms
288+
50
289+
end
290+
291+
def self.default_on_demand_fetch_max_retries
292+
10
293+
end
294+
281295
def self.default_impressions_mode
282296
:optimized
283297
end

spec/engine/api/segments_spec.rb

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,28 @@
4343
expect(log.string).to include ':added=>["max", "dan"]'
4444
end
4545

46+
it 'returns fetch_segments - with till param' do
47+
stub_request(:get, 'https://sdk.split.io/api/segmentChanges/employees?since=-1&till=222334')
48+
.with(headers: {
49+
'Accept' => '*/*',
50+
'Accept-Encoding' => 'gzip',
51+
'Authorization' => 'Bearer',
52+
'Connection' => 'keep-alive',
53+
'Keep-Alive' => '30',
54+
'Splitsdkversion' => "#{config.language}-#{config.version}"
55+
})
56+
.to_return(status: 200, body: segments)
57+
58+
fetch_options = { cache_control_headers: false, till: 222_334 }
59+
returned_segment = segments_api.send(:fetch_segment_changes, 'employees', -1, fetch_options)
60+
61+
expect(returned_segment[:name]).to eq 'employees'
62+
63+
expect(log.string).to include "'employees' segment retrieved."
64+
expect(log.string).to include "'employees' 2 added keys"
65+
expect(log.string).to include ':added=>["max", "dan"]'
66+
end
67+
4668
it 'returns fetch_segments - checking headers when cache_control_headers is true' do
4769
stub_request(:get, 'https://sdk.split.io/api/segmentChanges/employees?since=-1')
4870
.with(headers: {
@@ -56,7 +78,8 @@
5678
})
5779
.to_return(status: 200, body: segments)
5880

59-
returned_segment = segments_api.send(:fetch_segment_changes, 'employees', -1, true)
81+
fetch_options = { cache_control_headers: true, till: nil }
82+
returned_segment = segments_api.send(:fetch_segment_changes, 'employees', -1, fetch_options)
6083

6184
expect(returned_segment[:name]).to eq 'employees'
6285

spec/engine/api/splits_spec.rb

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,27 @@
4747
expect(log.string).to include returned_splits.to_s
4848
end
4949

50-
it 'returns the splits - checking headers when cache_control_headers is true ' do
50+
it 'returns the splits - with till param' do
51+
stub_request(:get, 'https://sdk.split.io/api/splitChanges?since=-1&till=123123')
52+
.with(headers: {
53+
'Accept' => '*/*',
54+
'Accept-Encoding' => 'gzip',
55+
'Authorization' => 'Bearer',
56+
'Connection' => 'keep-alive',
57+
'Keep-Alive' => '30',
58+
'Splitsdkversion' => "#{config.language}-#{config.version}"
59+
})
60+
.to_return(status: 200, body: splits)
61+
62+
fetch_options = { cache_control_headers: false, till: 123_123 }
63+
returned_splits = splits_api.since(-1, fetch_options)
64+
expect(returned_splits[:segment_names]).to eq(Set.new(%w[demo employees]))
65+
66+
expect(log.string).to include '2 splits retrieved. since=-1'
67+
expect(log.string).to include returned_splits.to_s
68+
end
69+
70+
it 'returns the splits - checking headers when cache_control_headers is true' do
5171
stub_request(:get, 'https://sdk.split.io/api/splitChanges?since=-1')
5272
.with(headers: {
5373
'Accept' => '*/*',
@@ -60,7 +80,8 @@
6080
})
6181
.to_return(status: 200, body: splits)
6282

63-
returned_splits = splits_api.since(-1, true)
83+
fetch_options = { cache_control_headers: true, till: nil }
84+
returned_splits = splits_api.since(-1, fetch_options)
6485
expect(returned_splits[:segment_names]).to eq(Set.new(%w[demo employees]))
6586

6687
expect(log.string).to include '2 splits retrieved. since=-1'

spec/splitclient/split_config_spec.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
expect(configs.ip_addresses_enabled).to eq default_ip
3232
expect(configs.machine_name).to eq SplitIoClient::SplitConfig.machine_hostname(default_ip, nil, :redis)
3333
expect(configs.machine_ip).to eq SplitIoClient::SplitConfig.machine_ip(default_ip, nil, :redis)
34+
expect(configs.on_demand_fetch_retry_delay_ms).to eq SplitIoClient::SplitConfig.default_on_demand_fetch_retry_delay_ms
35+
expect(configs.on_demand_fetch_max_retries).to eq SplitIoClient::SplitConfig.default_on_demand_fetch_max_retries
3436
end
3537

3638
it 'stores and retrieves correctly the customized values' do

0 commit comments

Comments
 (0)