network_resiliency 0.6.0 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9cd120266db1dfb8d2e5b37155534f3d5dc37a560d329352fa1a061ffd19ec97
4
- data.tar.gz: c09fb2b6dc81e74a838e7da9ae9bc7e4d177c9ba7104a3b8e6ecb6b8668ebf97
3
+ metadata.gz: 5a2741f43768bd43985efdbf000fc82075d8fb2757e6af19a7ab0aeeae2f3a87
4
+ data.tar.gz: 713af5ee87ca4a8149a3ce3f5d9416eb2fa03cc0bdea7aca1828e18a59595003
5
5
  SHA512:
6
- metadata.gz: 9caeeab2d22c4feea69b03438f8c66588179fe130ef1620935c475654a4661bbba36d82c79b4650fb3bcdead86cf0b5f3e3746513c40d16c8208b6f09ca32e5a
7
- data.tar.gz: 05ad9ab8d5ec490cf6064cc83c54e9132b2a10f4bf6ab8ca0ab83f94d84db706622c951a49ad0de8e0ac7551ce32963fb86ca7aad5d6f47bb0c33162d3ba0e6d
6
+ metadata.gz: 6d80cac5009c100449adec47f70636dc015b069dbd6e3901545f6378841de9ad8970b2156d948c4e9ff4deb1cb579141167078032af6faa88270d88566f592e0
7
+ data.tar.gz: 7a9f01e6967657f61a40d80755d95f1c67387f598bfa73efb6d3d6f38661a7e17e5ccdf058834e3e8b09ba89bdb0d286019a4c3832b4d54908d044f5db9565e9
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ### v0.6.2 (2023-11-26)
2
+ - syncer
3
+ - redis without_reconnect
4
+
5
+ ### v0.6.1 (2023-11-21)
6
+ - bugfix
7
+ - redis system errors
8
+
1
9
  ### v0.6.0 (2023-11-21)
2
10
  - http resiliency
3
11
  - redis resilience
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- network_resiliency (0.6.0)
4
+ network_resiliency (0.6.2)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -50,6 +50,9 @@ module NetworkResiliency
50
50
  timeouts = timeouts.last(1)
51
51
  end
52
52
 
53
+ original_max_retries = self.max_retries
54
+ self.max_retries = 0 # disable
55
+
53
56
  attempts = 0
54
57
  ts = -NetworkResiliency.timestamp
55
58
 
@@ -73,6 +76,7 @@ module NetworkResiliency
73
76
  ensure
74
77
  ts += NetworkResiliency.timestamp
75
78
  set_timeout.call(original_timeout)
79
+ self.max_retries = original_max_retries
76
80
 
77
81
  NetworkResiliency.record(
78
82
  adapter: "http",
@@ -107,12 +111,7 @@ module NetworkResiliency
107
111
 
108
112
  idepotent = Net::HTTP::IDEMPOTENT_METHODS_.include?(req.method)
109
113
 
110
- retries = self.max_retries
111
- self.max_retries = 0 # disable
112
-
113
114
  with_resilience(:request, destination, idepotent) { super }
114
- ensure
115
- self.max_retries = retries
116
115
  end
117
116
  end
118
117
  end
@@ -82,12 +82,16 @@ module NetworkResiliency
82
82
 
83
83
  @options[timeout_key] = timeouts.shift
84
84
 
85
- yield
86
- rescue ::Redis::BaseConnectionError => e
85
+ without_reconnect { yield }
86
+ rescue ::Redis::BaseConnectionError, SystemCallError => e
87
87
  # capture error
88
88
 
89
89
  # grab underlying exception within Redis wrapper
90
- error = e.cause.class
90
+ error = if e.is_a?(::Redis::BaseConnectionError)
91
+ e.cause.class
92
+ else
93
+ e.class
94
+ end
91
95
 
92
96
  retry if timeouts.size > 0
93
97
 
@@ -0,0 +1,39 @@
1
+ module NetworkResiliency
2
+ class Syncer < Thread
3
+ class << self
4
+ def start(redis)
5
+ @instance&.shutdown
6
+ @instance = new(redis)
7
+ end
8
+
9
+ def stop
10
+ @instance&.shutdown
11
+ @instance = nil
12
+ end
13
+ end
14
+
15
+ def initialize(redis)
16
+ @redis = redis
17
+
18
+ super { sync }
19
+ end
20
+
21
+ def shutdown
22
+ @shutdown = true
23
+
24
+ # prevent needless delay
25
+ raise Interrupt if status == "sleep"
26
+ end
27
+
28
+ private
29
+
30
+ def sync
31
+ until @shutdown
32
+ StatsEngine.sync(@redis)
33
+
34
+ sleep(3)
35
+ end
36
+ rescue Interrupt
37
+ end
38
+ end
39
+ end
@@ -1,3 +1,3 @@
1
1
  module NetworkResiliency
2
- VERSION = "0.6.0"
2
+ VERSION = "0.6.2"
3
3
  end
@@ -1,6 +1,7 @@
1
1
  require "network_resiliency/refinements"
2
2
  require "network_resiliency/stats"
3
3
  require "network_resiliency/stats_engine"
4
+ require "network_resiliency/syncer"
4
5
  require "network_resiliency/version"
5
6
 
6
7
  using NetworkResiliency::Refinements
@@ -24,7 +25,7 @@ module NetworkResiliency
24
25
  def configure
25
26
  yield self if block_given?
26
27
 
27
- start_syncing if redis
28
+ Syncer.start(redis) if redis
28
29
  end
29
30
 
30
31
  def patch(*adapters)
@@ -292,11 +293,7 @@ module NetworkResiliency
292
293
  @mode = nil
293
294
  Thread.current["network_resiliency"] = nil
294
295
  StatsEngine.reset
295
-
296
- if @sync_worker
297
- @sync_worker.kill
298
- @sync_worker = nil
299
- end
296
+ Syncer.stop
300
297
  end
301
298
 
302
299
  # private
@@ -304,18 +301,4 @@ module NetworkResiliency
304
301
  def thread_state
305
302
  Thread.current["network_resiliency"] ||= {}
306
303
  end
307
-
308
- def start_syncing
309
- @sync_worker.kill if @sync_worker
310
-
311
- raise "Redis not configured" unless redis
312
-
313
- @sync_worker = Thread.new do
314
- loop do
315
- StatsEngine.sync(redis)
316
-
317
- sleep(3)
318
- end
319
- end
320
- end
321
304
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: network_resiliency
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Pepper
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-11-21 00:00:00.000000000 Z
11
+ date: 2023-11-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: byebug
@@ -198,6 +198,7 @@ files:
198
198
  - lib/network_resiliency/refinements.rb
199
199
  - lib/network_resiliency/stats.rb
200
200
  - lib/network_resiliency/stats_engine.rb
201
+ - lib/network_resiliency/syncer.rb
201
202
  - lib/network_resiliency/version.rb
202
203
  - network_resiliency.gemspec
203
204
  homepage: https://github.com/dpep/network_resiliency_rb