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 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