splitclient-rb 7.0.4.pre.rc3-java → 7.1.0-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +10 -3
- data/CHANGES.txt +3 -0
- data/lib/splitclient-rb/cache/fetchers/segment_fetcher.rb +17 -6
- data/lib/splitclient-rb/cache/fetchers/split_fetcher.rb +21 -11
- data/lib/splitclient-rb/cache/repositories/splits_repository.rb +1 -1
- data/lib/splitclient-rb/clients/split_client.rb +4 -7
- data/lib/splitclient-rb/constants.rb +10 -0
- data/lib/splitclient-rb/engine/api/splits.rb +0 -1
- data/lib/splitclient-rb/engine/auth_api_client.rb +78 -0
- data/lib/splitclient-rb/engine/push_manager.rb +53 -0
- data/lib/splitclient-rb/engine/sync_manager.rb +123 -0
- data/lib/splitclient-rb/engine/synchronizer.rb +90 -0
- data/lib/splitclient-rb/exceptions.rb +8 -0
- data/lib/splitclient-rb/helpers/thread_helper.rb +25 -0
- data/lib/splitclient-rb/split_config.rb +42 -4
- data/lib/splitclient-rb/split_factory.rb +25 -15
- data/lib/splitclient-rb/sse/event_source/back_off.rb +25 -0
- data/lib/splitclient-rb/sse/event_source/client.rb +85 -60
- data/lib/splitclient-rb/sse/event_source/stream_data.rb +22 -0
- data/lib/splitclient-rb/sse/notification_manager_keeper.rb +71 -0
- data/lib/splitclient-rb/sse/notification_processor.rb +50 -0
- data/lib/splitclient-rb/sse/sse_handler.rb +47 -52
- data/lib/splitclient-rb/sse/workers/segments_worker.rb +21 -6
- data/lib/splitclient-rb/sse/workers/splits_worker.rb +24 -6
- data/lib/splitclient-rb/version.rb +1 -1
- data/lib/splitclient-rb.rb +10 -3
- data/splitclient-rb.gemspec +1 -0
- metadata +28 -7
- data/lib/splitclient-rb/engine/parser/split_adapter.rb +0 -105
- data/lib/splitclient-rb/sse/event_source/status.rb +0 -13
- data/lib/splitclient-rb/sse/workers/control_worker.rb +0 -34
@@ -4,22 +4,33 @@ module SplitIoClient
|
|
4
4
|
module SSE
|
5
5
|
module Workers
|
6
6
|
class SegmentsWorker
|
7
|
-
def initialize(
|
8
|
-
@
|
7
|
+
def initialize(synchronizer, config, segments_repository)
|
8
|
+
@synchronizer = synchronizer
|
9
9
|
@config = config
|
10
10
|
@segments_repository = segments_repository
|
11
|
-
@queue =
|
11
|
+
@queue = nil
|
12
|
+
end
|
12
13
|
|
13
|
-
|
14
|
+
def start
|
15
|
+
return if SplitIoClient::Helpers::ThreadHelper.alive?(:segment_update_worker, @config)
|
14
16
|
|
15
|
-
|
17
|
+
@queue = Queue.new
|
18
|
+
perform_thread
|
16
19
|
end
|
17
20
|
|
18
21
|
def add_to_queue(change_number, segment_name)
|
22
|
+
return if @queue.nil?
|
23
|
+
|
19
24
|
item = { change_number: change_number, segment_name: segment_name }
|
25
|
+
@config.logger.debug("SegmentsWorker add to queue #{item}")
|
20
26
|
@queue.push(item)
|
21
27
|
end
|
22
28
|
|
29
|
+
def stop
|
30
|
+
SplitIoClient::Helpers::ThreadHelper.stop(:segment_update_worker, @config)
|
31
|
+
@queue = nil
|
32
|
+
end
|
33
|
+
|
23
34
|
private
|
24
35
|
|
25
36
|
def perform
|
@@ -28,12 +39,16 @@ module SplitIoClient
|
|
28
39
|
change_number = item[:change_number]
|
29
40
|
since = @segments_repository.get_change_number(segment_name)
|
30
41
|
|
31
|
-
|
42
|
+
unless since >= change_number
|
43
|
+
@config.logger.debug("SegmentsWorker fetch_segment with #{since}")
|
44
|
+
@synchronizer.fetch_segment(segment_name)
|
45
|
+
end
|
32
46
|
end
|
33
47
|
end
|
34
48
|
|
35
49
|
def perform_thread
|
36
50
|
@config.threads[:segment_update_worker] = Thread.new do
|
51
|
+
@config.logger.debug('Starting segments worker ...') if @config.debug_enabled
|
37
52
|
perform
|
38
53
|
end
|
39
54
|
end
|
@@ -4,37 +4,55 @@ module SplitIoClient
|
|
4
4
|
module SSE
|
5
5
|
module Workers
|
6
6
|
class SplitsWorker
|
7
|
-
def initialize(
|
8
|
-
@
|
7
|
+
def initialize(synchronizer, config, splits_repository)
|
8
|
+
@synchronizer = synchronizer
|
9
9
|
@config = config
|
10
10
|
@splits_repository = splits_repository
|
11
|
-
|
11
|
+
end
|
12
12
|
|
13
|
-
|
13
|
+
def start
|
14
|
+
return if SplitIoClient::Helpers::ThreadHelper.alive?(:split_update_worker, @config)
|
14
15
|
|
15
|
-
|
16
|
+
@queue = Queue.new
|
17
|
+
perform_thread
|
16
18
|
end
|
17
19
|
|
18
20
|
def add_to_queue(change_number)
|
21
|
+
return if @queue.nil?
|
22
|
+
|
23
|
+
@config.logger.debug("SplitsWorker add to queue #{change_number}")
|
19
24
|
@queue.push(change_number)
|
20
25
|
end
|
21
26
|
|
22
27
|
def kill_split(change_number, split_name, default_treatment)
|
28
|
+
return if @queue.nil?
|
29
|
+
|
30
|
+
@config.logger.debug("SplitsWorker kill #{split_name}, #{change_number}")
|
23
31
|
@splits_repository.kill(change_number, split_name, default_treatment)
|
24
32
|
add_to_queue(change_number)
|
25
33
|
end
|
26
34
|
|
35
|
+
def stop
|
36
|
+
SplitIoClient::Helpers::ThreadHelper.stop(:split_update_worker, @config)
|
37
|
+
@queue = nil
|
38
|
+
end
|
39
|
+
|
27
40
|
private
|
28
41
|
|
29
42
|
def perform
|
30
43
|
while (change_number = @queue.pop)
|
31
44
|
since = @splits_repository.get_change_number
|
32
|
-
|
45
|
+
|
46
|
+
unless since.to_i >= change_number
|
47
|
+
@config.logger.debug("SplitsWorker fetch_splits with #{since}")
|
48
|
+
@synchronizer.fetch_splits
|
49
|
+
end
|
33
50
|
end
|
34
51
|
end
|
35
52
|
|
36
53
|
def perform_thread
|
37
54
|
@config.threads[:split_update_worker] = Thread.new do
|
55
|
+
@config.logger.debug('Starting splits worker ...') if @config.debug_enabled
|
38
56
|
perform
|
39
57
|
end
|
40
58
|
end
|
data/lib/splitclient-rb.rb
CHANGED
@@ -2,6 +2,7 @@ require 'forwardable'
|
|
2
2
|
|
3
3
|
require 'splitclient-rb/version'
|
4
4
|
|
5
|
+
require 'splitclient-rb/constants'
|
5
6
|
require 'splitclient-rb/exceptions'
|
6
7
|
require 'splitclient-rb/cache/routers/impression_router'
|
7
8
|
require 'splitclient-rb/cache/adapters/memory_adapters/map_adapter'
|
@@ -35,6 +36,7 @@ require 'splitclient-rb/cache/stores/localhost_split_store'
|
|
35
36
|
|
36
37
|
require 'splitclient-rb/clients/split_client'
|
37
38
|
require 'splitclient-rb/managers/split_manager'
|
39
|
+
require 'splitclient-rb/helpers/thread_helper'
|
38
40
|
require 'splitclient-rb/split_factory'
|
39
41
|
require 'splitclient-rb/split_factory_builder'
|
40
42
|
require 'splitclient-rb/split_config'
|
@@ -52,7 +54,6 @@ require 'splitclient-rb/engine/api/splits'
|
|
52
54
|
require 'splitclient-rb/engine/api/events'
|
53
55
|
require 'splitclient-rb/engine/parser/condition'
|
54
56
|
require 'splitclient-rb/engine/parser/partition'
|
55
|
-
require 'splitclient-rb/engine/parser/split_adapter'
|
56
57
|
require 'splitclient-rb/engine/parser/evaluator'
|
57
58
|
require 'splitclient-rb/engine/matchers/matcher'
|
58
59
|
require 'splitclient-rb/engine/matchers/combiners'
|
@@ -83,18 +84,24 @@ require 'splitclient-rb/engine/metrics/binary_search_latency_tracker'
|
|
83
84
|
require 'splitclient-rb/engine/models/split'
|
84
85
|
require 'splitclient-rb/engine/models/label'
|
85
86
|
require 'splitclient-rb/engine/models/treatment'
|
87
|
+
require 'splitclient-rb/engine/auth_api_client'
|
88
|
+
require 'splitclient-rb/engine/push_manager'
|
89
|
+
require 'splitclient-rb/engine/sync_manager'
|
90
|
+
require 'splitclient-rb/engine/synchronizer'
|
86
91
|
require 'splitclient-rb/utilitites'
|
87
92
|
|
88
93
|
# redis metrics fixer
|
89
94
|
require 'splitclient-rb/redis_metrics_fixer'
|
90
95
|
|
91
96
|
# SSE
|
97
|
+
require 'splitclient-rb/sse/event_source/back_off'
|
92
98
|
require 'splitclient-rb/sse/event_source/client'
|
93
99
|
require 'splitclient-rb/sse/event_source/event_types'
|
94
|
-
require 'splitclient-rb/sse/event_source/
|
95
|
-
require 'splitclient-rb/sse/workers/control_worker'
|
100
|
+
require 'splitclient-rb/sse/event_source/stream_data'
|
96
101
|
require 'splitclient-rb/sse/workers/segments_worker'
|
97
102
|
require 'splitclient-rb/sse/workers/splits_worker'
|
103
|
+
require 'splitclient-rb/sse/notification_manager_keeper'
|
104
|
+
require 'splitclient-rb/sse/notification_processor'
|
98
105
|
require 'splitclient-rb/sse/sse_handler'
|
99
106
|
|
100
107
|
# C extension
|
data/splitclient-rb.gemspec
CHANGED
@@ -51,6 +51,7 @@ Gem::Specification.new do |spec|
|
|
51
51
|
spec.add_runtime_dependency 'concurrent-ruby', '~> 1.0'
|
52
52
|
spec.add_runtime_dependency 'faraday', '>= 0.8'
|
53
53
|
spec.add_runtime_dependency 'json', '>= 1.8'
|
54
|
+
spec.add_runtime_dependency 'jwt', '>= 2.2.1'
|
54
55
|
spec.add_runtime_dependency 'lru_redux'
|
55
56
|
spec.add_runtime_dependency 'net-http-persistent', '>= 2.9'
|
56
57
|
spec.add_runtime_dependency 'redis', '>= 3.2'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: splitclient-rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 7.0
|
4
|
+
version: 7.1.0
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Split Software
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-04-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
@@ -220,6 +220,20 @@ dependencies:
|
|
220
220
|
- - ">="
|
221
221
|
- !ruby/object:Gem::Version
|
222
222
|
version: '1.8'
|
223
|
+
- !ruby/object:Gem::Dependency
|
224
|
+
requirement: !ruby/object:Gem::Requirement
|
225
|
+
requirements:
|
226
|
+
- - ">="
|
227
|
+
- !ruby/object:Gem::Version
|
228
|
+
version: 2.2.1
|
229
|
+
name: jwt
|
230
|
+
prerelease: false
|
231
|
+
type: :runtime
|
232
|
+
version_requirements: !ruby/object:Gem::Requirement
|
233
|
+
requirements:
|
234
|
+
- - ">="
|
235
|
+
- !ruby/object:Gem::Version
|
236
|
+
version: 2.2.1
|
223
237
|
- !ruby/object:Gem::Dependency
|
224
238
|
requirement: !ruby/object:Gem::Requirement
|
225
239
|
requirements:
|
@@ -346,6 +360,7 @@ files:
|
|
346
360
|
- lib/splitclient-rb/cache/stores/sdk_blocker.rb
|
347
361
|
- lib/splitclient-rb/cache/stores/store_utils.rb
|
348
362
|
- lib/splitclient-rb/clients/split_client.rb
|
363
|
+
- lib/splitclient-rb/constants.rb
|
349
364
|
- lib/splitclient-rb/engine/api/client.rb
|
350
365
|
- lib/splitclient-rb/engine/api/events.rb
|
351
366
|
- lib/splitclient-rb/engine/api/faraday_adapter/patched_net_http_persistent.rb
|
@@ -354,6 +369,7 @@ files:
|
|
354
369
|
- lib/splitclient-rb/engine/api/metrics.rb
|
355
370
|
- lib/splitclient-rb/engine/api/segments.rb
|
356
371
|
- lib/splitclient-rb/engine/api/splits.rb
|
372
|
+
- lib/splitclient-rb/engine/auth_api_client.rb
|
357
373
|
- lib/splitclient-rb/engine/evaluator/splitter.rb
|
358
374
|
- lib/splitclient-rb/engine/matchers/all_keys_matcher.rb
|
359
375
|
- lib/splitclient-rb/engine/matchers/between_matcher.rb
|
@@ -385,8 +401,11 @@ files:
|
|
385
401
|
- lib/splitclient-rb/engine/parser/condition.rb
|
386
402
|
- lib/splitclient-rb/engine/parser/evaluator.rb
|
387
403
|
- lib/splitclient-rb/engine/parser/partition.rb
|
388
|
-
- lib/splitclient-rb/engine/
|
404
|
+
- lib/splitclient-rb/engine/push_manager.rb
|
405
|
+
- lib/splitclient-rb/engine/sync_manager.rb
|
406
|
+
- lib/splitclient-rb/engine/synchronizer.rb
|
389
407
|
- lib/splitclient-rb/exceptions.rb
|
408
|
+
- lib/splitclient-rb/helpers/thread_helper.rb
|
390
409
|
- lib/splitclient-rb/managers/split_manager.rb
|
391
410
|
- lib/splitclient-rb/redis_metrics_fixer.rb
|
392
411
|
- lib/splitclient-rb/split_config.rb
|
@@ -394,11 +413,13 @@ files:
|
|
394
413
|
- lib/splitclient-rb/split_factory_builder.rb
|
395
414
|
- lib/splitclient-rb/split_factory_registry.rb
|
396
415
|
- lib/splitclient-rb/split_logger.rb
|
416
|
+
- lib/splitclient-rb/sse/event_source/back_off.rb
|
397
417
|
- lib/splitclient-rb/sse/event_source/client.rb
|
398
418
|
- lib/splitclient-rb/sse/event_source/event_types.rb
|
399
|
-
- lib/splitclient-rb/sse/event_source/
|
419
|
+
- lib/splitclient-rb/sse/event_source/stream_data.rb
|
420
|
+
- lib/splitclient-rb/sse/notification_manager_keeper.rb
|
421
|
+
- lib/splitclient-rb/sse/notification_processor.rb
|
400
422
|
- lib/splitclient-rb/sse/sse_handler.rb
|
401
|
-
- lib/splitclient-rb/sse/workers/control_worker.rb
|
402
423
|
- lib/splitclient-rb/sse/workers/segments_worker.rb
|
403
424
|
- lib/splitclient-rb/sse/workers/splits_worker.rb
|
404
425
|
- lib/splitclient-rb/utilitites.rb
|
@@ -423,9 +444,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
423
444
|
version: '0'
|
424
445
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
425
446
|
requirements:
|
426
|
-
- - "
|
447
|
+
- - ">="
|
427
448
|
- !ruby/object:Gem::Version
|
428
|
-
version:
|
449
|
+
version: '0'
|
429
450
|
requirements: []
|
430
451
|
rubyforge_project:
|
431
452
|
rubygems_version: 2.6.14
|
@@ -1,105 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
require 'thread'
|
3
|
-
|
4
|
-
include SplitIoClient::Cache::Fetchers
|
5
|
-
include SplitIoClient::Cache::Stores
|
6
|
-
include SplitIoClient::Cache::Senders
|
7
|
-
|
8
|
-
module SplitIoClient
|
9
|
-
#
|
10
|
-
# acts as an api adapater to connect to split endpoints
|
11
|
-
# uses a configuration object that can be modified when creating the client instance
|
12
|
-
# also, uses safe threads to execute fetches and post give the time execution values from the config
|
13
|
-
#
|
14
|
-
class SplitAdapter < NoMethodError
|
15
|
-
attr_reader :splits_repository, :segments_repository, :impressions_repository, :metrics, :split_fetcher, :segment_fetcher
|
16
|
-
|
17
|
-
#
|
18
|
-
# Creates a new split api adapter instance that consumes split api endpoints
|
19
|
-
#
|
20
|
-
# @param api_key [String] the API key for your split account
|
21
|
-
# @param splits_repository [SplitsRepository] SplitsRepository instance to store splits in
|
22
|
-
# @param segments_repository [SegmentsRepository] SegmentsRepository instance to store segments in
|
23
|
-
# @param impressions_repository [ImpressionsRepository] ImpressionsRepository instance to store impressions in
|
24
|
-
# @param metrics_repository [MetricsRepository] MetricsRepository instance to store metrics in
|
25
|
-
# @param sdk_blocker [SDKBlocker] SDKBlocker instance which blocks splits_repository/segments_repository
|
26
|
-
#
|
27
|
-
# @return [SplitIoClient] split.io client instance
|
28
|
-
def initialize(
|
29
|
-
api_key,
|
30
|
-
splits_repository,
|
31
|
-
segments_repository,
|
32
|
-
impressions_repository,
|
33
|
-
metrics_repository,
|
34
|
-
events_repository,
|
35
|
-
sdk_blocker,
|
36
|
-
config
|
37
|
-
)
|
38
|
-
@api_key = api_key
|
39
|
-
@splits_repository = splits_repository
|
40
|
-
@segments_repository = segments_repository
|
41
|
-
@impressions_repository = impressions_repository
|
42
|
-
@metrics_repository = metrics_repository
|
43
|
-
@events_repository = events_repository
|
44
|
-
@metrics = Metrics.new(100, @metrics_repository)
|
45
|
-
@sdk_blocker = sdk_blocker
|
46
|
-
@config = config
|
47
|
-
|
48
|
-
start_localhost_components if @config.localhost_mode
|
49
|
-
|
50
|
-
start_standalone_components if @config.standalone? && !@config.localhost_mode
|
51
|
-
end
|
52
|
-
|
53
|
-
def start_standalone_components
|
54
|
-
split_fetch
|
55
|
-
segment_fetch
|
56
|
-
metrics_sender
|
57
|
-
impressions_sender
|
58
|
-
events_sender
|
59
|
-
end
|
60
|
-
|
61
|
-
def start_localhost_components
|
62
|
-
localhost_split_store
|
63
|
-
localhost_repo_cleaner
|
64
|
-
end
|
65
|
-
|
66
|
-
# Starts thread which loops constantly and retrieves splits from a file source
|
67
|
-
def localhost_split_store
|
68
|
-
LocalhostSplitStore.new(@splits_repository, @config, @sdk_blocker).call
|
69
|
-
end
|
70
|
-
|
71
|
-
# Starts thread which loops constantly and cleans up repositories to avoid memory issues in localhost mode
|
72
|
-
def localhost_repo_cleaner
|
73
|
-
LocalhostRepoCleaner.new(@impressions_repository, @metrics_repository, @events_repository, @config).call
|
74
|
-
end
|
75
|
-
|
76
|
-
# Starts thread which loops constantly and stores splits in the splits_repository of choice
|
77
|
-
def split_fetch
|
78
|
-
@split_fetcher = SplitFetcher.new(@splits_repository, @api_key, @metrics, @config, @sdk_blocker)
|
79
|
-
@split_fetcher.fetch_splits if @config.push_notification_enabled
|
80
|
-
@split_fetcher.call unless @config.push_notification_enabled
|
81
|
-
end
|
82
|
-
|
83
|
-
# Starts thread which loops constantly and stores segments in the segments_repository of choice
|
84
|
-
def segment_fetch
|
85
|
-
@segment_fetcher = SegmentFetcher.new(@segments_repository, @api_key, @metrics, @config, @sdk_blocker)
|
86
|
-
@segment_fetcher.fetch_segments if @config.push_notification_enabled
|
87
|
-
@segment_fetcher.call unless @config.push_notification_enabled
|
88
|
-
end
|
89
|
-
|
90
|
-
# Starts thread which loops constantly and sends impressions to the Split API
|
91
|
-
def impressions_sender
|
92
|
-
ImpressionsSender.new(@impressions_repository, @api_key, @config).call
|
93
|
-
end
|
94
|
-
|
95
|
-
# Starts thread which loops constantly and sends metrics to the Split API
|
96
|
-
def metrics_sender
|
97
|
-
MetricsSender.new(@metrics_repository, @api_key, @config).call
|
98
|
-
end
|
99
|
-
|
100
|
-
# Starts thread which loops constantly and sends events to the Split API
|
101
|
-
def events_sender
|
102
|
-
EventsSender.new(@events_repository, @config).call
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module SplitIoClient
|
4
|
-
module SSE
|
5
|
-
module Workers
|
6
|
-
class ControlWorker
|
7
|
-
def initialize(adapter, config)
|
8
|
-
@adapter = adapter
|
9
|
-
@config = config
|
10
|
-
|
11
|
-
perform_thread
|
12
|
-
|
13
|
-
perform_passenger_forked if defined?(PhusionPassenger)
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
17
|
-
|
18
|
-
def perform
|
19
|
-
# TODO: IMPLEMENT THIS METHOD
|
20
|
-
end
|
21
|
-
|
22
|
-
def perform_thread
|
23
|
-
@config.threads[:segment_update_worker] = Thread.new do
|
24
|
-
perform
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def perform_passenger_forked
|
29
|
-
PhusionPassenger.on_event(:starting_worker_process) { |forked| perform_thread if forked }
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|