semian 0.5.1 → 0.5.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|