semian 0.5.1 → 0.5.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 +4 -4
- data/lib/semian/circuit_breaker.rb +8 -6
- data/lib/semian/protected_resource.rb +2 -1
- data/lib/semian/unprotected_resource.rb +12 -0
- data/lib/semian/version.rb +1 -1
- data/test/circuit_breaker_test.rb +12 -0
- data/test/net_http_test.rb +2 -2
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2297213cb021d0958a8826c46536af57862e7582
|
|
4
|
+
data.tar.gz: cd2683b720caa4b4e5dfe2e8db5a774b822f13ca
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: cb26790fd5481ada268ae712f500ccbf52df6b39bb05634d913811c8fe55d75d1e5cd2523157386dca701b154dfacc6f48a233215bccef3485ffed52ab8c9974
|
|
7
|
+
data.tar.gz: 1d193bb017105f5d4c5aaa7f4872034997f564d9bd8a863fccc285f7b9e94fe6465a917101161e43dfee0383dccc1157d83fc0054479526ecb8a288bcab55e60
|
|
@@ -2,6 +2,8 @@ module Semian
|
|
|
2
2
|
class CircuitBreaker #:nodoc:
|
|
3
3
|
extend Forwardable
|
|
4
4
|
|
|
5
|
+
def_delegators :@state, :closed?, :open?, :half_open?
|
|
6
|
+
|
|
5
7
|
def initialize(name, exceptions:, success_threshold:, error_threshold:, error_timeout:, implementation:)
|
|
6
8
|
@name = name.to_sym
|
|
7
9
|
@success_count_threshold = success_threshold
|
|
@@ -15,6 +17,8 @@ module Semian
|
|
|
15
17
|
end
|
|
16
18
|
|
|
17
19
|
def acquire
|
|
20
|
+
half_open if open? && error_timeout_expired?
|
|
21
|
+
|
|
18
22
|
raise OpenCircuitError unless request_allowed?
|
|
19
23
|
|
|
20
24
|
result = nil
|
|
@@ -30,9 +34,10 @@ module Semian
|
|
|
30
34
|
end
|
|
31
35
|
|
|
32
36
|
def request_allowed?
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
37
|
+
closed? ||
|
|
38
|
+
half_open? ||
|
|
39
|
+
# The circuit breaker is officially open, but it will transition to half-open on the next attempt.
|
|
40
|
+
(open? && error_timeout_expired?)
|
|
36
41
|
end
|
|
37
42
|
|
|
38
43
|
def mark_failed(_error)
|
|
@@ -64,9 +69,6 @@ module Semian
|
|
|
64
69
|
|
|
65
70
|
private
|
|
66
71
|
|
|
67
|
-
def_delegators :@state, :closed?, :open?, :half_open?
|
|
68
|
-
private :closed?, :open?, :half_open?
|
|
69
|
-
|
|
70
72
|
def close
|
|
71
73
|
log_state_transition(:closed)
|
|
72
74
|
@state.close
|
|
@@ -3,7 +3,8 @@ module Semian
|
|
|
3
3
|
extend Forwardable
|
|
4
4
|
|
|
5
5
|
def_delegators :@resource, :destroy, :count, :semid, :tickets, :name
|
|
6
|
-
def_delegators :@circuit_breaker, :reset, :mark_failed, :mark_success, :request_allowed
|
|
6
|
+
def_delegators :@circuit_breaker, :reset, :mark_failed, :mark_success, :request_allowed?,
|
|
7
|
+
:open?, :closed?, :half_open?
|
|
7
8
|
|
|
8
9
|
def initialize(resource, circuit_breaker)
|
|
9
10
|
@resource = resource
|
data/lib/semian/version.rb
CHANGED
|
@@ -86,6 +86,18 @@ class TestCircuitBreaker < Minitest::Test
|
|
|
86
86
|
Semian.destroy(:three)
|
|
87
87
|
end
|
|
88
88
|
|
|
89
|
+
def test_request_allowed_query_doesnt_trigger_transitions
|
|
90
|
+
Timecop.travel(Time.now - 6) do
|
|
91
|
+
open_circuit!
|
|
92
|
+
|
|
93
|
+
refute_predicate @resource, :request_allowed?
|
|
94
|
+
assert_predicate @resource, :open?
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
assert_predicate @resource, :request_allowed?
|
|
98
|
+
assert_predicate @resource, :open?
|
|
99
|
+
end
|
|
100
|
+
|
|
89
101
|
private
|
|
90
102
|
|
|
91
103
|
def open_circuit!(resource = @resource)
|
data/test/net_http_test.rb
CHANGED
|
@@ -11,7 +11,7 @@ class TestNetHTTP < Minitest::Test
|
|
|
11
11
|
end
|
|
12
12
|
end
|
|
13
13
|
|
|
14
|
-
HOSTNAME = "
|
|
14
|
+
HOSTNAME = "127.0.0.1"
|
|
15
15
|
PORT = 31_050
|
|
16
16
|
TOXIC_PORT = PORT + 1
|
|
17
17
|
DEFAULT_SEMIAN_OPTIONS = {
|
|
@@ -346,7 +346,7 @@ class TestNetHTTP < Minitest::Test
|
|
|
346
346
|
with_server(addresses: ["#{HOSTNAME}:#{PORT + 100}"], reset_semian_state: false) do |hostname, port|
|
|
347
347
|
with_toxic(hostname: hostname, upstream_port: port, toxic_port: port + 1) do |_|
|
|
348
348
|
assert_raises Net::CircuitOpenError do
|
|
349
|
-
Net::HTTP.get(URI("http
|
|
349
|
+
Net::HTTP.get(URI("http://#{HOSTNAME}:#{port + 1}/200"))
|
|
350
350
|
end
|
|
351
351
|
end
|
|
352
352
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: semian
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.5.
|
|
4
|
+
version: 0.5.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Scott Francis
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2016-
|
|
12
|
+
date: 2016-08-10 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: rake-compiler
|
|
@@ -195,7 +195,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
195
195
|
version: '0'
|
|
196
196
|
requirements: []
|
|
197
197
|
rubyforge_project:
|
|
198
|
-
rubygems_version: 2.
|
|
198
|
+
rubygems_version: 2.5.1
|
|
199
199
|
signing_key:
|
|
200
200
|
specification_version: 4
|
|
201
201
|
summary: Bulkheading for Ruby with SysV semaphores
|