faulty 0.8.6 → 0.8.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +160 -28
- data/README.md +19 -0
- data/lib/faulty/circuit.rb +3 -5
- data/lib/faulty/deprecation.rb +1 -1
- data/lib/faulty/patch/base.rb +2 -2
- data/lib/faulty/patch/redis.rb +2 -4
- data/lib/faulty/status.rb +3 -1
- data/lib/faulty/storage/circuit_proxy.rb +1 -0
- data/lib/faulty/storage/fallback_chain.rb +8 -0
- data/lib/faulty/storage/fault_tolerant_proxy.rb +8 -1
- data/lib/faulty/storage/interface.rb +11 -0
- data/lib/faulty/storage/memory.rb +7 -0
- data/lib/faulty/storage/null.rb +5 -0
- data/lib/faulty/storage/redis.rb +56 -42
- data/lib/faulty/version.rb +1 -1
- data/lib/faulty.rb +23 -0
- metadata +6 -45
- data/.github/workflows/ci.yml +0 -66
- data/.gitignore +0 -11
- data/.rspec +0 -2
- data/.rubocop.yml +0 -97
- data/Gemfile +0 -32
- data/bin/benchmark +0 -75
- data/bin/check-version +0 -14
- data/bin/console +0 -12
- data/bin/rspec +0 -29
- data/bin/rubocop +0 -29
- data/bin/yard +0 -29
- data/bin/yardoc +0 -29
- data/bin/yri +0 -29
- data/faulty.gemspec +0 -36
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3148a3eb0ec2e45213ddb40bef524a3b0fa83e83b467101982d7ced65cbac71a
|
4
|
+
data.tar.gz: fd9584532fde4f3409720ca1884f825fc4d6eabb4ebe133c80e969bc0131ab9f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 330476d53d625bb22dbd2f5855dd40f4f4849135b1407df72e9ff3849504341f9e67cf6ce5bb0606bd62100a9d11dda2f7d7754be081b40b8c81784d1e25265d
|
7
|
+
data.tar.gz: 9f8023dbd90ea1d9fb55a1a5c7a9c96a9344b0db43e0735113545406734e0f02ea14bcc1550b8d2b335e1b59bd63591812ed2426f66f097789185531f6d2db51
|
data/CHANGELOG.md
CHANGED
@@ -1,12 +1,46 @@
|
|
1
|
-
|
1
|
+
Changelog
|
2
|
+
===================
|
3
|
+
|
4
|
+
All notable changes to this project will be documented in this file.
|
5
|
+
|
6
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
7
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
8
|
+
|
9
|
+
[Unreleased]
|
10
|
+
-------------------
|
11
|
+
|
12
|
+
[0.8.7] - 2022-08-11
|
13
|
+
-------------------
|
14
|
+
|
15
|
+
### Added
|
16
|
+
|
17
|
+
* Add a Faulty#clear method to reset all circuits #55 justinhoward
|
18
|
+
|
19
|
+
### Fixed
|
20
|
+
|
21
|
+
* Update rubocop cleanup gemspec #56 justinhoward
|
22
|
+
|
23
|
+
[0.8.6] - 2022-02-24
|
24
|
+
-------------------
|
25
|
+
|
26
|
+
### Added
|
2
27
|
|
3
28
|
* Define an inspect method that represent circuit #50 JuanitoFatas
|
4
29
|
|
5
|
-
|
30
|
+
[0.8.5] - 2022-02-17
|
31
|
+
-------------------
|
32
|
+
|
33
|
+
### Added
|
34
|
+
|
35
|
+
* Add granular errors for Elasticsearch patch #48 justinhoward
|
36
|
+
|
37
|
+
### Fixed
|
6
38
|
|
7
39
|
* Fix yard warnings #49 justinhoward
|
8
40
|
* Fix crash in Redis storage backend if opened_at was missing #46 justinhoward
|
9
|
-
|
41
|
+
|
42
|
+
### Changed
|
43
|
+
|
10
44
|
* Return status conditionally for Storage::Interface#entry #45 justinhoward
|
11
45
|
|
12
46
|
### Deprecations
|
@@ -18,22 +52,35 @@
|
|
18
52
|
* The error_module option is deprecated. Patches should use the error_mapper
|
19
53
|
option instead. The option will be removed in 0.9
|
20
54
|
|
55
|
+
[0.8.4] - 2022-01-28
|
56
|
+
-------------------
|
21
57
|
|
22
|
-
|
58
|
+
### Added
|
23
59
|
|
24
60
|
* Add Elasticsearch client patch #44 justinhoward
|
25
61
|
|
26
|
-
|
62
|
+
[0.8.2] - 2021-10-18
|
63
|
+
-------------------
|
64
|
+
|
65
|
+
### Fixed
|
27
66
|
|
28
67
|
* Fix crash for older versions of concurrent-ruby #42 justinhoward
|
29
68
|
|
30
|
-
|
69
|
+
[0.8.1] - 2021-09-22
|
70
|
+
-------------------
|
71
|
+
|
72
|
+
### Changed
|
31
73
|
|
32
74
|
* Add cause message to CircuitTrippedError #40 justinhoward
|
75
|
+
|
76
|
+
### Fixed
|
77
|
+
|
33
78
|
* Record failures for cache hits #41 justinhoward
|
34
79
|
|
80
|
+
[0.8.0] - 2021-09-14
|
81
|
+
-------------------
|
35
82
|
|
36
|
-
|
83
|
+
### Added
|
37
84
|
|
38
85
|
* Store circuit options in the backend when run #34 justinhoward
|
39
86
|
|
@@ -52,16 +99,28 @@
|
|
52
99
|
instances, so likely this will not be a breaking change for most
|
53
100
|
cases.
|
54
101
|
|
55
|
-
|
102
|
+
[0.7.2] - 2021-09-02
|
103
|
+
-------------------
|
104
|
+
|
105
|
+
### Added
|
56
106
|
|
57
107
|
* Add Faulty.disable! for disabling globally #38 justinhoward
|
108
|
+
|
109
|
+
### Changed
|
110
|
+
|
58
111
|
* Suppress circuit_success for proxy circuits #39 justinhoward
|
59
112
|
|
60
|
-
|
113
|
+
[0.7.1] - 2021-09-02
|
114
|
+
-------------------
|
115
|
+
|
116
|
+
### Fixed
|
61
117
|
|
62
118
|
* Fix success event crash in log listener #37 justinhoward
|
63
119
|
|
64
|
-
|
120
|
+
[0.7.0] - 2021-09-02
|
121
|
+
-------------------
|
122
|
+
|
123
|
+
### Added
|
65
124
|
|
66
125
|
* Add initial benchmarks and performance improvements #36 justinhoward
|
67
126
|
|
@@ -70,22 +129,37 @@
|
|
70
129
|
The `circuit_success` event no longer contains the status value. Computing this
|
71
130
|
value was causing performance problems.
|
72
131
|
|
73
|
-
|
132
|
+
[0.6.0] - 2021-06-10
|
133
|
+
-------------------
|
134
|
+
|
135
|
+
### Added
|
136
|
+
|
137
|
+
* Capture an error for BUSY redis backend when patched #30 justinhoward
|
138
|
+
* Add a patch for mysql2 #28 justinhoward
|
139
|
+
|
140
|
+
### Fixed
|
74
141
|
|
75
142
|
* docs, use correct state in description for skipped event #27 senny
|
76
143
|
* Fix CI to set REDIS_VERSION correctly #31 justinhoward
|
77
144
|
* Fix a potential memory leak in patches #32 justinhoward
|
78
|
-
* Capture an error for BUSY redis backend when patched #30 justinhoward
|
79
|
-
* Add a patch for mysql2 #28 justinhoward
|
80
145
|
|
81
|
-
|
146
|
+
[0.5.1] - 2021-05-28
|
147
|
+
-------------------
|
148
|
+
|
149
|
+
### Fixed
|
82
150
|
|
83
151
|
* Fix Storage::FaultTolerantProxy to return empty history on entries fail #26 justinhoward
|
84
152
|
|
85
|
-
|
153
|
+
[0.5.0] - 2021-05-28
|
154
|
+
-------------------
|
155
|
+
|
156
|
+
### Added
|
86
157
|
|
87
158
|
* Allow creating a new Faulty instance in Faulty#register #24 justinhoward
|
88
159
|
* Add support for patches to core dependencies starting with redis #14 justinhoward
|
160
|
+
|
161
|
+
### Fixed
|
162
|
+
|
89
163
|
* Improve storage #entries performance by returning entries #23 justinhoward
|
90
164
|
|
91
165
|
### Breaking Changes
|
@@ -95,23 +169,35 @@ value was causing performance problems.
|
|
95
169
|
* Faulty::Storage::Interface must now return a history array instead of a
|
96
170
|
circuit status object. Custom storage backends must be updated.
|
97
171
|
|
98
|
-
|
172
|
+
[0.4.0] - 2021-02-19
|
173
|
+
-------------------
|
174
|
+
|
175
|
+
### Added
|
99
176
|
|
100
|
-
* Switch from Travis CI to GitHub actions #11 justinhoward
|
101
|
-
* Only run rubocop for Ruby 2.7 in CI #12 justinhoward
|
102
177
|
* Explicitly add support for Redis 3 and 4 #15 justinhoward
|
103
178
|
* Allow setting default circuit options on Faulty instances #16 justinhoward
|
179
|
+
|
180
|
+
### Changed
|
181
|
+
|
182
|
+
* Switch from Travis CI to GitHub actions #11 justinhoward
|
183
|
+
* Only run rubocop for Ruby 2.7 in CI #12 justinhoward
|
104
184
|
* Switch to codacy for quality metrics #17 justinhoward
|
185
|
+
* Allow passing custom circuit to AutoWire #22 justinhoward
|
186
|
+
|
187
|
+
### Fixed
|
188
|
+
|
105
189
|
* Small logic fix to README #19 silasb
|
106
190
|
* Fix Redis storage dependency on ConnectionPool #21 justinhoward
|
107
|
-
* Allow passing custom circuit to AutoWire #22 justinhoward
|
108
191
|
|
109
192
|
### Breaking Changes
|
110
193
|
|
111
194
|
AutoWire.new is replaced with AutoWire.wrap and no longer creates an instance
|
112
195
|
of AutoWire.
|
113
196
|
|
114
|
-
|
197
|
+
[0.3.0] - 2020-10-24
|
198
|
+
-------------------
|
199
|
+
|
200
|
+
### Added
|
115
201
|
|
116
202
|
* Add tools for backend fault-tolerance #10
|
117
203
|
* CircuitProxy for wrapping storage in an internal circuit
|
@@ -120,7 +206,10 @@ of AutoWire.
|
|
120
206
|
* AutoWire wrappers for automatically configuring storage and cache
|
121
207
|
* Better documentation for fault-tolerance
|
122
208
|
|
123
|
-
|
209
|
+
[0.2.0] - 2020-10-18
|
210
|
+
-------------------
|
211
|
+
|
212
|
+
### Changed
|
124
213
|
|
125
214
|
* Remove Scopes and replace them with Faulty instances #9
|
126
215
|
|
@@ -129,28 +218,71 @@ of AutoWire.
|
|
129
218
|
* `Faulty::Scope` has been removed. Use `Faulty.new` instead.
|
130
219
|
* `Faulty` is now a class, not a module
|
131
220
|
|
132
|
-
|
221
|
+
[0.1.5] - 2020-10-18
|
222
|
+
-------------------
|
223
|
+
|
224
|
+
### Fixed
|
133
225
|
|
134
226
|
* Fix redis storage to expire state key when using CAS #8
|
135
227
|
|
136
|
-
|
228
|
+
[0.1.4] - 2020-10-18
|
229
|
+
-------------------
|
230
|
+
|
231
|
+
### Fixed
|
137
232
|
|
138
233
|
* Improve spec coverage for supporting classes #6
|
139
234
|
* Fix redis bug where concurrent CAS requests could crash #7
|
140
235
|
|
141
|
-
|
236
|
+
[0.1.3] - 2020-09-29
|
237
|
+
-------------------
|
238
|
+
|
239
|
+
### Added
|
142
240
|
|
143
|
-
* Fix bug where memory storage would delete the newest entries #5
|
144
241
|
* Add HoneybadgerListener for error reporting #4
|
145
242
|
|
146
|
-
|
243
|
+
### Fixed
|
244
|
+
|
245
|
+
* Fix bug where memory storage would delete the newest entries #5
|
246
|
+
|
247
|
+
[0.1.2] - 2020-08-28
|
248
|
+
-------------------
|
249
|
+
|
250
|
+
### Fixed
|
147
251
|
|
148
252
|
* Fix Storage::FaultTolerantProxy open and reopen methods #2
|
149
253
|
|
150
|
-
|
254
|
+
[0.1.1] - 2020-08-28
|
255
|
+
-------------------
|
256
|
+
|
257
|
+
### Fixed
|
151
258
|
|
152
259
|
* Fix a crash when Storage::FaultTolerantProxy created a status stub #1
|
153
260
|
|
154
|
-
|
261
|
+
[0.1.0] - 2020-08-27
|
262
|
+
-------------------
|
155
263
|
|
156
264
|
Initial public release
|
265
|
+
|
266
|
+
[Unreleased]: https://github.com/ParentSquare/faulty/compare/v0.5.0...HEAD
|
267
|
+
[0.8.6]: https://github.com/ParentSquare/faulty/compare/v0.8.5...v0.8.6
|
268
|
+
[0.8.5]: https://github.com/ParentSquare/faulty/compare/v0.8.4...v0.8.5
|
269
|
+
[0.8.4]: https://github.com/ParentSquare/faulty/compare/v0.8.3...v0.8.4
|
270
|
+
[0.8.3]: https://github.com/ParentSquare/faulty/compare/v0.8.2...v0.8.3
|
271
|
+
[0.8.2]: https://github.com/ParentSquare/faulty/compare/v0.8.1...v0.8.2
|
272
|
+
[0.8.1]: https://github.com/ParentSquare/faulty/compare/v0.8.0...v0.8.1
|
273
|
+
[0.8.0]: https://github.com/ParentSquare/faulty/compare/v0.7.2...v0.8.0
|
274
|
+
[0.7.2]: https://github.com/ParentSquare/faulty/compare/v0.7.1...v0.7.2
|
275
|
+
[0.7.1]: https://github.com/ParentSquare/faulty/compare/v0.7.0...v0.7.1
|
276
|
+
[0.7.0]: https://github.com/ParentSquare/faulty/compare/v0.6.0...v0.7.0
|
277
|
+
[0.6.0]: https://github.com/ParentSquare/faulty/compare/v0.5.1...v0.5.0
|
278
|
+
[0.5.1]: https://github.com/ParentSquare/faulty/compare/v0.5.0...v0.5.1
|
279
|
+
[0.5.0]: https://github.com/ParentSquare/faulty/compare/v0.4.0...v0.5.0
|
280
|
+
[0.4.0]: https://github.com/ParentSquare/faulty/compare/v0.3.0...v0.4.0
|
281
|
+
[0.3.0]: https://github.com/ParentSquare/faulty/compare/v0.2.0...v0.3.0
|
282
|
+
[0.2.0]: https://github.com/ParentSquare/faulty/compare/v0.1.5...v0.2.0
|
283
|
+
[0.1.5]: https://github.com/ParentSquare/faulty/releases/tag/v0.1.4...v0.1.5
|
284
|
+
[0.1.4]: https://github.com/ParentSquare/faulty/releases/tag/v0.1.3...v0.1.4
|
285
|
+
[0.1.3]: https://github.com/ParentSquare/faulty/releases/tag/v0.1.2...v0.1.3
|
286
|
+
[0.1.2]: https://github.com/ParentSquare/faulty/releases/tag/v0.1.1...v0.1.2
|
287
|
+
[0.1.1]: https://github.com/ParentSquare/faulty/releases/tag/v0.1.0...v0.1.1
|
288
|
+
[0.1.0]: https://github.com/ParentSquare/faulty/releases/tag/v0.1.0
|
data/README.md
CHANGED
@@ -90,6 +90,7 @@ Also see "Release It!: Design and Deploy Production-Ready Software" by
|
|
90
90
|
+ [Other Built-in Listeners](#other-built-in-listeners)
|
91
91
|
+ [Custom Listeners](#custom-listeners)
|
92
92
|
* [Disabling Faulty Globally](#disabling-faulty-globally)
|
93
|
+
* [Testing with Faulty](#testing-with-faulty)
|
93
94
|
* [How it Works](#how-it-works)
|
94
95
|
+ [Caching](#caching)
|
95
96
|
+ [Fault Tolerance](#fault-tolerance)
|
@@ -1173,6 +1174,24 @@ not affect the stored state of circuits.
|
|
1173
1174
|
Faulty will **still use the cache** even when disabled. If you also want to
|
1174
1175
|
disable the cache, configure Faulty to use a `Faulty::Cache::Null` cache.
|
1175
1176
|
|
1177
|
+
## Testing with Faulty
|
1178
|
+
|
1179
|
+
Depending on your application, you could choose to
|
1180
|
+
[disable Faulty globally](#disabling-faulty-globally), but sometimes you may
|
1181
|
+
want to test your application's behavior in a failure scenario.
|
1182
|
+
|
1183
|
+
If you have such tests, you will want to prevent failures in one test from
|
1184
|
+
affecting other tests. To clear all circuit states between tests, use `#clear!`.
|
1185
|
+
For example, with rspec:
|
1186
|
+
|
1187
|
+
```ruby
|
1188
|
+
RSpec.configure do |config|
|
1189
|
+
config.after do
|
1190
|
+
Faulty.clear!
|
1191
|
+
end
|
1192
|
+
end
|
1193
|
+
```
|
1194
|
+
|
1176
1195
|
## How it Works
|
1177
1196
|
|
1178
1197
|
Faulty implements a version of circuit breakers inspired by "Release It!: Design
|
data/lib/faulty/circuit.rb
CHANGED
@@ -23,7 +23,7 @@ class Faulty
|
|
23
23
|
# write your own code to periodically check how long it has been running.
|
24
24
|
# If you're sure you want ruby's generic Timeout, you can apply it yourself
|
25
25
|
# inside the circuit run block.
|
26
|
-
class Circuit
|
26
|
+
class Circuit
|
27
27
|
CACHE_REFRESH_SUFFIX = '.faulty_refresh'
|
28
28
|
|
29
29
|
attr_reader :name
|
@@ -462,15 +462,13 @@ class Faulty
|
|
462
462
|
end
|
463
463
|
options.notifier.notify(:circuit_failure, circuit: self, status: status, error: error)
|
464
464
|
|
465
|
-
|
465
|
+
if status.half_open?
|
466
466
|
reopen!(error, status.opened_at)
|
467
467
|
elsif status.fails_threshold?
|
468
468
|
open!(error)
|
469
469
|
else
|
470
470
|
false
|
471
471
|
end
|
472
|
-
|
473
|
-
opened
|
474
472
|
end
|
475
473
|
|
476
474
|
def deprecated_entry?
|
@@ -550,7 +548,7 @@ class Faulty
|
|
550
548
|
# @return [Boolean] true if the cache should be refreshed
|
551
549
|
def cache_should_refresh?(key)
|
552
550
|
time = options.cache.read(cache_refresh_key(key.to_s)).to_i
|
553
|
-
time + (rand * 2 - 1) * options.cache_refresh_jitter < Faulty.current_time
|
551
|
+
time + (((rand * 2) - 1) * options.cache_refresh_jitter) < Faulty.current_time
|
554
552
|
end
|
555
553
|
|
556
554
|
# Get the next time to refresh the cache when writing to it
|
data/lib/faulty/deprecation.rb
CHANGED
@@ -5,7 +5,7 @@ class Faulty
|
|
5
5
|
module Deprecation
|
6
6
|
class << self
|
7
7
|
# Call to raise errors instead of logging warnings for Faulty deprecations
|
8
|
-
def raise_errors!(enabled = true)
|
8
|
+
def raise_errors!(enabled = true) # rubocop:disable Style/OptionalBooleanParameter
|
9
9
|
@raise_errors = (enabled == true)
|
10
10
|
end
|
11
11
|
|
data/lib/faulty/patch/base.rb
CHANGED
@@ -31,13 +31,13 @@ class Faulty
|
|
31
31
|
#
|
32
32
|
# @yield A block to run inside the circuit
|
33
33
|
# @return The block return value
|
34
|
-
def faulty_run
|
34
|
+
def faulty_run(&block)
|
35
35
|
faulty_running_key = "faulty_running_#{object_id}"
|
36
36
|
return yield unless @faulty_circuit
|
37
37
|
return yield if Thread.current[faulty_running_key]
|
38
38
|
|
39
39
|
Thread.current[faulty_running_key] = true
|
40
|
-
@faulty_circuit.run
|
40
|
+
@faulty_circuit.run(&block)
|
41
41
|
ensure
|
42
42
|
Thread.current[faulty_running_key] = nil
|
43
43
|
end
|
data/lib/faulty/patch/redis.rb
CHANGED
@@ -81,10 +81,8 @@ class Faulty
|
|
81
81
|
return super unless @faulty_circuit
|
82
82
|
|
83
83
|
reply = super
|
84
|
-
if reply.is_a?(::Redis::CommandError)
|
85
|
-
|
86
|
-
reply = BusyError.new(reply.message)
|
87
|
-
end
|
84
|
+
if reply.is_a?(::Redis::CommandError) && reply.message.start_with?('BUSY')
|
85
|
+
reply = BusyError.new(reply.message)
|
88
86
|
end
|
89
87
|
|
90
88
|
reply
|
data/lib/faulty/status.rb
CHANGED
@@ -159,6 +159,14 @@ class Faulty
|
|
159
159
|
end
|
160
160
|
end
|
161
161
|
|
162
|
+
# Clears circuits in all storage backends
|
163
|
+
#
|
164
|
+
# @param (see Interface#clear)
|
165
|
+
# @return (see Interface#clear)
|
166
|
+
def clear
|
167
|
+
send_all(:clear)
|
168
|
+
end
|
169
|
+
|
162
170
|
# This is fault tolerant if any of the available backends are fault tolerant
|
163
171
|
#
|
164
172
|
# @param (see Interface#fault_tolerant?)
|
@@ -81,7 +81,14 @@ class Faulty
|
|
81
81
|
# @see Interface#list
|
82
82
|
# @param (see Interface#list)
|
83
83
|
# @return (see Interface#list)
|
84
|
-
|
84
|
+
#
|
85
|
+
# @!method clear
|
86
|
+
# Clear is not called in normal operation, so it doesn't capture errors
|
87
|
+
#
|
88
|
+
# @see Interface#list
|
89
|
+
# @param (see Interface#list)
|
90
|
+
# @return (see Interface#list)
|
91
|
+
def_delegators :@storage, :lock, :unlock, :reset, :history, :list, :clear
|
85
92
|
|
86
93
|
# Get circuit options safely
|
87
94
|
#
|
@@ -172,6 +172,17 @@ class Faulty
|
|
172
172
|
raise NotImplementedError
|
173
173
|
end
|
174
174
|
|
175
|
+
# Reset all circuits
|
176
|
+
#
|
177
|
+
# Some implementions may clear circuits on a best-effort basis since
|
178
|
+
# all circuits may not be known.
|
179
|
+
#
|
180
|
+
# @raise NotImplementedError If the storage backend does not support clearing.
|
181
|
+
# @return [void]
|
182
|
+
def clear
|
183
|
+
raise NotImplementedError
|
184
|
+
end
|
185
|
+
|
175
186
|
# Can this storage backend raise an error?
|
176
187
|
#
|
177
188
|
# If the storage backend returns false from this method, it will be wrapped
|