Skip to content

Commit 4d4c830

Browse files
committed
polish
1 parent fc69af4 commit 4d4c830

File tree

3 files changed

+74
-55
lines changed

3 files changed

+74
-55
lines changed

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

Lines changed: 37 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ def since(since, since_rbs, fetch_options = { cache_control_headers: false, till
4343
params[:till] = fetch_options[:till] unless fetch_options[:till].nil?
4444
@config.logger.debug("Fetching from splitChanges with #{params}: ")
4545
response = get_api("#{@config.base_uri}/splitChanges", @api_key, params, fetch_options[:cache_control_headers])
46-
4746
if response.status == 414
4847
@config.logger.error("Error fetching feature flags; the amount of flag sets provided are too big, causing uri length error.")
4948
raise ApiException.new response.body, 414
@@ -56,44 +55,17 @@ def since(since, since_rbs, fetch_options = { cache_control_headers: false, till
5655
return since(since, 0, fetch_options = {cache_control_headers: fetch_options[:cache_control_headers], till: fetch_options[:till],
5756
sets: fetch_options[:sets]})
5857
end
59-
6058
if response.success?
6159
result = JSON.parse(response.body, symbolize_names: true)
62-
if @spec_version == Splits::SPEC_1_1
63-
result = convert_to_new_spec(result)
64-
end
65-
66-
result[:rbs][:d] = check_rbs_data(result[:rbs][:d])
67-
result = objects_with_segment_names(result)
68-
69-
if @spec_version == SplitIoClient::Spec::FeatureFlags::SPEC_VERSION
70-
@clear_storage = @last_proxy_check_timestamp != 0
71-
@last_proxy_check_timestamp = 0
72-
end
73-
74-
unless result[:ff][:d].empty?
75-
@config.split_logger.log_if_debug("#{result[:ff][:d].length} feature flags retrieved. since=#{since}")
76-
end
77-
@config.split_logger.log_if_transport("Feature flag changes response: #{result[:ff].to_s}")
78-
79-
unless result[:rbs][:d].empty?
80-
@config.split_logger.log_if_debug("#{result[:rbs][:d].length} rule based segments retrieved. since=#{since_rbs}")
81-
end
82-
@config.split_logger.log_if_transport("rule based segments changes response: #{result[:rbs].to_s}")
83-
84-
bucket = BinarySearchLatencyTracker.get_bucket((Time.now - start) * 1000.0)
85-
@telemetry_runtime_producer.record_sync_latency(Telemetry::Domain::Constants::SPLIT_SYNC, bucket)
86-
@telemetry_runtime_producer.record_successful_sync(Telemetry::Domain::Constants::SPLIT_SYNC, (Time.now.to_f * 1000.0).to_i)
87-
88-
result
89-
else
90-
@telemetry_runtime_producer.record_sync_error(Telemetry::Domain::Constants::SPLIT_SYNC, response.status)
9160

92-
@config.logger.error("Unexpected status code while fetching feature flags: #{response.status}. " \
93-
'Check your API key and base URI')
94-
95-
raise 'Split SDK failed to connect to backend to fetch feature flags definitions'
61+
return process_result(result, since, since_rbs, start)
9662
end
63+
@telemetry_runtime_producer.record_sync_error(Telemetry::Domain::Constants::SPLIT_SYNC, response.status)
64+
65+
@config.logger.error("Unexpected status code while fetching feature flags: #{response.status}. " \
66+
'Check your API key and base URI')
67+
68+
raise 'Split SDK failed to connect to backend to fetch feature flags definitions'
9769
end
9870

9971
def clear_storage
@@ -102,6 +74,36 @@ def clear_storage
10274

10375
private
10476

77+
def process_result(result, since, since_rbs, start)
78+
if @spec_version == Splits::SPEC_1_1
79+
result = convert_to_new_spec(result)
80+
end
81+
82+
result[:rbs][:d] = check_rbs_data(result[:rbs][:d])
83+
result = objects_with_segment_names(result)
84+
85+
if @spec_version == SplitIoClient::Spec::FeatureFlags::SPEC_VERSION
86+
@clear_storage = @last_proxy_check_timestamp != 0
87+
@last_proxy_check_timestamp = 0
88+
end
89+
90+
unless result[:ff][:d].empty?
91+
@config.split_logger.log_if_debug("#{result[:ff][:d].length} feature flags retrieved. since=#{since}")
92+
end
93+
@config.split_logger.log_if_transport("Feature flag changes response: #{result[:ff].to_s}")
94+
95+
unless result[:rbs][:d].empty?
96+
@config.split_logger.log_if_debug("#{result[:rbs][:d].length} rule based segments retrieved. since=#{since_rbs}")
97+
end
98+
@config.split_logger.log_if_transport("rule based segments changes response: #{result[:rbs].to_s}")
99+
100+
bucket = BinarySearchLatencyTracker.get_bucket((Time.now - start) * 1000.0)
101+
@telemetry_runtime_producer.record_sync_latency(Telemetry::Domain::Constants::SPLIT_SYNC, bucket)
102+
@telemetry_runtime_producer.record_successful_sync(Telemetry::Domain::Constants::SPLIT_SYNC, (Time.now.to_f * 1000.0).to_i)
103+
104+
result
105+
end
106+
105107
def check_rbs_data(rbs_data)
106108
rbs_data.each do |rb_segment|
107109
rb_segment[:excluded] = {:keys => [], :segments => []} if rb_segment[:excluded].nil?

lib/splitclient-rb/engine/parser/evaluator.rb

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,8 @@ def split_configurations(treatment, split)
3838
end
3939

4040
def match(split, keys, attributes)
41-
if split.key?(:prerequisites) && !split[:prerequisites].nil?
42-
prerequisites_matcher = SplitIoClient::PrerequisitesMatcher.new(split[:prerequisites], @config.split_logger)
43-
return treatment_hash(Models::Label::PREREQUISITES_NOT_MET, split[:defaultTreatment], split[:changeNumber], split_configurations(split[:defaultTreatment], split)) unless prerequisites_matcher.match?(
44-
matching_key: keys[:matching_key],
45-
bucketing_key: keys[:bucketing_key],
46-
evaluator: self,
47-
attributes: attributes
48-
)
49-
end
41+
42+
return treatment_hash(Models::Label::PREREQUISITES_NOT_MET, split[:defaultTreatment], split[:changeNumber], split_configurations(split[:defaultTreatment], split)) unless check_prerequisites_matcher(split, keys, attributes)
5043

5144
in_rollout = false
5245
key = keys[:bucketing_key] ? keys[:bucketing_key] : keys[:matching_key]
@@ -80,19 +73,39 @@ def match(split, keys, attributes)
8073

8174
result = splitter.get_treatment(key, split[:seed], condition.partitions, split[:algo])
8275

83-
if result.nil?
84-
return treatment_hash(Models::Label::NO_RULE_MATCHED, split[:defaultTreatment], split[:changeNumber], split_configurations(split[:defaultTreatment], split))
85-
else
86-
return treatment_hash(c[:label], result, split[:changeNumber],split_configurations(result, split))
87-
end
76+
return treatment_from_result(result, split, c)
8877
end
8978

9079
treatment_hash(Models::Label::NO_RULE_MATCHED, split[:defaultTreatment], split[:changeNumber], split_configurations(split[:defaultTreatment], split))
9180
end
9281

82+
private
83+
84+
def treatment_from_result(result, split, condition)
85+
if result.nil?
86+
return treatment_hash(Models::Label::NO_RULE_MATCHED, split[:defaultTreatment], split[:changeNumber], split_configurations(split[:defaultTreatment], split))
87+
else
88+
return treatment_hash(condition[:label], result, split[:changeNumber],split_configurations(result, split))
89+
end
90+
end
91+
9392
def treatment_hash(label, treatment, change_number = nil, configurations = nil)
9493
{ label: label, treatment: treatment, change_number: change_number, config: configurations }
9594
end
95+
96+
def check_prerequisites_matcher(split, keys, attributes)
97+
if split.key?(:prerequisites) && !split[:prerequisites].nil?
98+
prerequisites_matcher = SplitIoClient::PrerequisitesMatcher.new(split[:prerequisites], @config.split_logger)
99+
return prerequisites_matcher.match?(
100+
matching_key: keys[:matching_key],
101+
bucketing_key: keys[:bucketing_key],
102+
evaluator: self,
103+
attributes: attributes
104+
)
105+
end
106+
107+
true
108+
end
96109
end
97110
end
98111
end

lib/splitclient-rb/engine/synchronizer.rb

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,7 @@ def fetch_splits(target_change_number, rbs_target_change_number)
9797

9898
attempts = ON_DEMAND_FETCH_BACKOFF_MAX_RETRIES - result[:remaining_attempts]
9999

100-
if result[:success]
101-
@segment_fetcher.fetch_segments_if_not_exists(result[:segment_names], true) unless result[:segment_names].empty?
102-
@config.logger.debug("Refresh completed bypassing the CDN in #{attempts} attempts.") if @config.debug_enabled
103-
else
104-
@config.logger.debug("No changes fetched after #{attempts} attempts with CDN bypassed.") if @config.debug_enabled
105-
end
100+
process_result(result, attempts)
106101
rescue StandardError => e
107102
@config.log_found_exception(__method__.to_s, e)
108103
end
@@ -145,6 +140,15 @@ def fetch_segment(name, target_change_number)
145140

146141
private
147142

143+
def process_result(result, attempts)
144+
if result[:success]
145+
@segment_fetcher.fetch_segments_if_not_exists(result[:segment_names], true) unless result[:segment_names].empty?
146+
@config.logger.debug("Refresh completed bypassing the CDN in #{attempts} attempts.") if @config.debug_enabled
147+
else
148+
@config.logger.debug("No changes fetched after #{attempts} attempts with CDN bypassed.") if @config.debug_enabled
149+
end
150+
end
151+
148152
def attempt_segment_sync(name, target_cn, fetch_options, max_retries, retry_delay_seconds, with_backoff)
149153
remaining_attempts = max_retries
150154
@segments_sync_backoff.reset

0 commit comments

Comments
 (0)