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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0532f143d15332f8eecabff2391ed1c76ce8eb91
4
- data.tar.gz: c2ea379d573f6aa1c8deb9424e58dee11e2a5aac
3
+ metadata.gz: 2297213cb021d0958a8826c46536af57862e7582
4
+ data.tar.gz: cd2683b720caa4b4e5dfe2e8db5a774b822f13ca
5
5
  SHA512:
6
- metadata.gz: 82b383f6258ffd5a781f7cdd02f240ac09c9a9614939e6ddb4f9c0a10cae937c496297ea304f65f55f4849371f3a379f781c5e970b99d6031d8286b420a31d11
7
- data.tar.gz: 13a138c9f5e63f07ea20bb317e7af3e561cad52a8a00545305c0cd73aa72ec4620eccd5917da49e9f4d0abf62db06f6bb48bd47a55c1074034b731524f6914d7
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
- return true if closed?
34
- half_open if error_timeout_expired?
35
- !open?
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
@@ -30,6 +30,18 @@ module Semian
30
30
  def reset
31
31
  end
32
32
 
33
+ def open?
34
+ false
35
+ end
36
+
37
+ def closed?
38
+ true
39
+ end
40
+
41
+ def half_open?
42
+ false
43
+ end
44
+
33
45
  def request_allowed?
34
46
  true
35
47
  end
@@ -1,3 +1,3 @@
1
1
  module Semian
2
- VERSION = '0.5.1'
2
+ VERSION = '0.5.2'
3
3
  end
@@ -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)
@@ -11,7 +11,7 @@ class TestNetHTTP < Minitest::Test
11
11
  end
12
12
  end
13
13
 
14
- HOSTNAME = "localhost"
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://localhost:#{port + 1}/200"))
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.1
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-07-11 00:00:00.000000000 Z
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.2.3
198
+ rubygems_version: 2.5.1
199
199
  signing_key:
200
200
  specification_version: 4
201
201
  summary: Bulkheading for Ruby with SysV semaphores