prefab-cloud-ruby 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: aa167019e6d70cdde48a87afc80b4363eca3d3d9
4
- data.tar.gz: 761b554954582f17a31ab902bd02eb6b856df250
3
+ metadata.gz: 4b7a0a43eadc51e6ebfbd7573865ba48dd139bd1
4
+ data.tar.gz: 30e99adf8c06969e29034fbff3a711838b471e0a
5
5
  SHA512:
6
- metadata.gz: 0cdfd19ee6df21bddb493d4cfbf95434c6d5c3d89065c115465db6a3298caff128a5734fae7dee0df26fe1e113229710b2371324afa7b1472b347eebc26fe7e1
7
- data.tar.gz: f5945febd993742430b3ff909d3d27d306d171e542bd336408a70adfea705267e46f12c95eb0bb4cb411154e276dd808b1a84a55e214e9d735d94797534b0916
6
+ metadata.gz: 29262f1a91dd5c7322152e27fe4352c4a6974f17d891f29bdaed79aedda4c258c13ba4576337936d6b5fcf7b22a3a0eb793e1a4ce9b1b1185dac95e9f88bb352
7
+ data.tar.gz: cf12cc1441b1a8786f40cf309128129570fe061b9eb41a1c59ed8cc0159a54376cd3711809e4e76f52edefecccb5409b59c3d37ce7997bd38d1ee5da7801c1ad
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.7
1
+ 0.0.8
data/lib/prefab/client.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Prefab
2
2
  class Client
3
- attr_reader :account_id, :shared_cache, :stats, :namespace, :logger
3
+ attr_reader :account_id, :shared_cache, :stats, :namespace, :logger, :creds, :channel, :interceptor
4
4
 
5
5
  def initialize(api_key:,
6
6
  logger: nil,
@@ -26,22 +26,12 @@ module Prefab
26
26
  end
27
27
  end
28
28
 
29
- def config_client(timeout: 10.0)
30
- @config_client ||= Prefab::ConfigClient.new(Prefab::ConfigService::Stub.new(nil,
31
- @creds,
32
- channel_override: @channel,
33
- timeout: timeout,
34
- interceptors: [@interceptor]),
35
- self)
29
+ def config_client(timeout: 5.0)
30
+ @config_client ||= Prefab::ConfigClient.new(self, timeout)
36
31
  end
37
32
 
38
33
  def ratelimit_client(timeout: 5.0)
39
- @ratelimit_client ||= Prefab::RateLimitClient.new(Prefab::RateLimitService::Stub.new(nil,
40
- @creds,
41
- channel_override: @channel,
42
- timeout: timeout,
43
- interceptors: [@interceptor]),
44
- self)
34
+ @ratelimit_client ||= Prefab::RateLimitClient.new(self, timeout)
45
35
  end
46
36
 
47
37
  private
@@ -1,37 +1,61 @@
1
1
  module Prefab
2
2
  class ConfigClient
3
- def initialize(config_service, client)
3
+ RECONNECT_WAIT = 5
4
+
5
+ def initialize(client, timeout)
4
6
  @client = client
5
- @config_service = config_service
7
+ @timeout = timeout
6
8
  @config_resolver = EzConfig::ConfigResolver.new(client)
7
- boot_resolver(@config_service)
9
+ boot_resolver
8
10
  end
9
11
 
10
12
  def get(prop)
11
13
  @config_resolver.get(prop)
12
14
  end
13
15
 
14
- def set(config_value)
15
- @config_service.upsert(config_value)
16
+ def set(config_delta)
17
+ Retry.it method(:stub_with_timout), :upsert, config_delta, @timeout
18
+ end
19
+
20
+ def to_s
21
+ @config_resolver.to_s
16
22
  end
17
23
 
18
24
  private
19
25
 
20
- def boot_resolver(config_service)
21
- config_req = Prefab::ConfigServicePointer.new(account_id: 1,
26
+ def stub
27
+ Prefab::ConfigService::Stub.new(nil,
28
+ nil,
29
+ channel_override: @client.channel,
30
+ interceptors: [@client.interceptor])
31
+ end
32
+
33
+ def stub_with_timout
34
+ Prefab::ConfigService::Stub.new(nil,
35
+ nil,
36
+ channel_override: @client.channel,
37
+ timeout: @timeout,
38
+ interceptors: [@client.interceptor])
39
+ end
40
+
41
+ def boot_resolver
42
+ config_req = Prefab::ConfigServicePointer.new(account_id: @client.account_id,
22
43
  start_at_id: 0)
23
44
 
24
45
  Thread.new do
25
- begin
26
- resp = config_service.get_config(config_req)
27
- resp.each do |r|
28
- r.deltas.each do |delta|
29
- @config_resolver.set(delta)
46
+ while true do
47
+ begin
48
+ resp = stub.get_config(config_req)
49
+ resp.each do |r|
50
+ r.deltas.each do |delta|
51
+ @config_resolver.set(delta)
52
+ end
53
+ @config_resolver.update
30
54
  end
31
- @config_resolver.update
55
+ rescue => e
56
+ sleep(RECONNECT_WAIT)
57
+ @client.logger.info("config client encountered #{e.message} pausing #{RECONNECT_WAIT}")
32
58
  end
33
- rescue => e
34
- @client.logger.warn(e)
35
59
  end
36
60
  end
37
61
  end
@@ -6,19 +6,34 @@ module EzConfig
6
6
  @local_store = {}
7
7
  @namespace = client.namespace
8
8
  @config_loader = EzConfig::ConfigLoader.new(client.logger)
9
+ @logger = client.logger
9
10
  make_local
10
11
  end
11
12
 
13
+ def to_s
14
+ str = ""
15
+ @lock.with_read_lock do
16
+ @local_store.each do |k, v|
17
+ value = v[:value]
18
+ case value.type
19
+ when :string then
20
+ str << "#{k} #{value.string}"
21
+ when :int then
22
+ str << "#{k} #{value.int}"
23
+ end
24
+ end
25
+ end
26
+ str
27
+ end
28
+
12
29
  def get(property)
13
30
  value = @lock.with_read_lock do
14
31
  @local_store[property][:value]
15
32
  end
16
33
  case value.type
17
34
  when :string then
18
- puts "SSString"
19
35
  value.string
20
36
  when :int then
21
- puts "INT"
22
37
  value.int
23
38
  end
24
39
  end
@@ -53,12 +68,12 @@ module EzConfig
53
68
  store[property] = { namespace: namespace, value: value }
54
69
  end
55
70
  end
56
-
57
- puts "prop #{property} namespace #{namespace} value #{value}"
58
71
  end
59
72
  @lock.with_write_lock do
60
73
  @local_store = store
61
74
  end
75
+
76
+ @logger.info "Updated to #{to_s}"
62
77
  end
63
78
  end
64
79
  end
@@ -1,7 +1,8 @@
1
1
  module Prefab
2
2
  class RateLimitClient
3
- def initialize(ratelimit_service, client)
4
- @ratelimit_service = ratelimit_service
3
+
4
+ def initialize(client, timeout)
5
+ @timeout = timeout
5
6
  @client = client
6
7
  end
7
8
 
@@ -25,10 +26,10 @@ module Prefab
25
26
  allow_partial_response: allow_partial_response
26
27
  )
27
28
 
28
- result = @ratelimit_service.limit_check(req)
29
+ result = Retry.it(method(:stub), :limit_check, req, @timeout)
29
30
 
30
31
  reset = result.limit_reset_at
31
- @client.shared_cache.write(expiry_cache_key, reset) unless reset < 1
32
+ @client.shared_cache.write(expiry_cache_key, reset) unless reset < 1 # protobuf default int to 0
32
33
 
33
34
  @client.stats.increment("prefab.ratelimit.limitcheck", tags: ["policy_group:#{result.policy_group}", "pass:#{result.passed}"])
34
35
 
@@ -40,8 +41,17 @@ module Prefab
40
41
 
41
42
  private
42
43
 
44
+ def stub
45
+ Prefab::RateLimitService::Stub.new(nil,
46
+ nil,
47
+ channel_override: @client.channel,
48
+ timeout: @timeout,
49
+ interceptors: [@client.interceptor])
50
+ end
51
+
43
52
  def handle_error(e, on_error, groups)
44
53
  @client.stats.increment("prefab.ratelimit.error", tags: ["type:limit"])
54
+
45
55
  message = "ratelimit for #{groups} error: #{e.message}"
46
56
  case on_error
47
57
  when :log_and_pass
@@ -0,0 +1,26 @@
1
+ class Retry
2
+ DEFAULT_TIMEOUT = 10
3
+ MAX_SLEEP_SEC = 10
4
+ BASE_SLEEP_SEC = 0.5
5
+
6
+ # GRPC Generally handles timeouts for us
7
+ # but if the connection is broken we want to retry up until the timeout
8
+ def self.it(stub_factory, rpc, req, timeout)
9
+ attempts = 0
10
+ start_time = Time.now
11
+
12
+ begin
13
+ attempts += 1
14
+
15
+ return stub_factory.call.send(rpc, req)
16
+ rescue => exception
17
+ raise exception if Time.now - start_time > timeout
18
+
19
+ sleep_seconds = [BASE_SLEEP_SEC * (2 ** (attempts - 1)), MAX_SLEEP_SEC].min
20
+ sleep_seconds = sleep_seconds * (0.5 * (1 + rand()))
21
+ sleep_seconds = [BASE_SLEEP_SEC, sleep_seconds].max
22
+ sleep sleep_seconds
23
+ retry
24
+ end
25
+ end
26
+ end
@@ -11,4 +11,5 @@ require 'prefab/config_client'
11
11
  require 'prefab/auth_interceptor'
12
12
  require 'prefab/noop_cache'
13
13
  require 'prefab/noop_stats'
14
+ require 'prefab/retry'
14
15
 
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: prefab-cloud-ruby 0.0.7 ruby lib
5
+ # stub: prefab-cloud-ruby 0.0.8 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "prefab-cloud-ruby".freeze
9
- s.version = "0.0.7"
9
+ s.version = "0.0.8"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Jeff Dwyer".freeze]
14
- s.date = "2017-12-19"
14
+ s.date = "2017-12-22"
15
15
  s.description = "RateLimits & Config as a service".freeze
16
16
  s.email = "jdwyer@prefab.cloud".freeze
17
17
  s.extra_rdoc_files = [
@@ -34,6 +34,7 @@ Gem::Specification.new do |s|
34
34
  "lib/prefab/noop_cache.rb",
35
35
  "lib/prefab/noop_stats.rb",
36
36
  "lib/prefab/ratelimit_client.rb",
37
+ "lib/prefab/retry.rb",
37
38
  "lib/prefab/store.rb",
38
39
  "lib/prefab_pb.rb",
39
40
  "lib/prefab_services_pb.rb",
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prefab-cloud-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Dwyer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-19 00:00:00.000000000 Z
11
+ date: 2017-12-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: grpc
@@ -151,6 +151,7 @@ files:
151
151
  - lib/prefab/noop_cache.rb
152
152
  - lib/prefab/noop_stats.rb
153
153
  - lib/prefab/ratelimit_client.rb
154
+ - lib/prefab/retry.rb
154
155
  - lib/prefab/store.rb
155
156
  - lib/prefab_pb.rb
156
157
  - lib/prefab_services_pb.rb