eventmachine-circuit_breaker 0.1.0 → 0.1.1

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: 6547a8dbd0d172bbab8aa845e8f6a710827b4ab7
4
- data.tar.gz: 8d7055f41829d12155f7ec5a9303c15df31b6333
3
+ metadata.gz: 0fac17cd1c217a581a1421c8fbe47f917997b0f7
4
+ data.tar.gz: 8016eae41151aa46be8f5b5413f0657a85b0586d
5
5
  SHA512:
6
- metadata.gz: b4505e388cb189625c17b8f7847703cf24b74bb609d85b62a60c29db55f7e60d8246f3618a05360c89b77969aaab92432169e5599d2934fb2153113fda4952e2
7
- data.tar.gz: 86b765fed2e48efaa4e3a13f45caba5008acc6527f012d96367643493b38367e2ec04e3d3bd54994f789f42a6392389d296e428f295d7d0a0123080d6b142c79
6
+ metadata.gz: 2c48dfb236934a39deed5ce6649416724d73cf8d7bceb48d61401c1dbfed6d477644754d5674352f57e53f372bacc4964e3594502d6536eb2c45a969fd74106d
7
+ data.tar.gz: d2aa3e2dfdca9fab26969a469770c27ad533382f1195729ad4e8524e5243f7276813b98ea4fd2e8a3e4416d31b34ee6ad94bb3434980ffac714e141118a78154
@@ -1,4 +1,5 @@
1
1
  require "eventmachine/circuit_breaker/version"
2
+ require "eventmachine/circuit_breaker/rw_mutex"
2
3
  require "eventmachine/circuit_breaker/breaker"
3
4
  require "eventmachine/circuit_breaker/strategy/basic"
4
5
 
@@ -7,6 +7,7 @@ module EventMachine
7
7
 
8
8
  def request(client, headers, body)
9
9
  close!(client) if strategy.open?
10
+ [client, headers]
10
11
  end
11
12
 
12
13
  def response(client)
@@ -0,0 +1,32 @@
1
+ require "thread"
2
+
3
+ module EventMachine
4
+ module CircuitBreaker
5
+ class RWMutex
6
+ def initialize
7
+ @counter = 0
8
+ @counter_mutex = Mutex.new
9
+ @global_mutex = Mutex.new
10
+ end
11
+
12
+ def read_lock
13
+ @counter_mutex.synchronize do
14
+ @counter += 1
15
+ @global_mutex.lock if @counter == 1
16
+ end
17
+ yield if block_given?
18
+ ensure
19
+ @counter_mutex.synchronize do
20
+ @counter -= 1
21
+ @global_mutex.unlock if @counter == 0
22
+ end
23
+ end
24
+
25
+ def write_lock
26
+ @global_mutex.synchronize do
27
+ yield if block_given?
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -3,13 +3,14 @@ module EventMachine
3
3
  module Strategy
4
4
  class Basic
5
5
  def initialize(failure_count: 5, recovery_time: 30)
6
+ @mutex = EventMachine::CircuitBreaker::RWMutex.new
6
7
  close!
7
8
  @failure_limit = failure_count
8
9
  @recovery_time = recovery_time
9
10
  end
10
11
 
11
12
  def open?
12
- @state == :open
13
+ mutex.read_lock { @state == :open }
13
14
  end
14
15
 
15
16
  def handle_response(client)
@@ -19,28 +20,32 @@ module EventMachine
19
20
 
20
21
  private
21
22
 
23
+ attr_reader :mutex
24
+
22
25
  def half_open?
23
- @state == :half_open
26
+ mutex.read_lock { @state == :half_open }
24
27
  end
25
28
 
26
29
  def increment_failures
27
- @failures += 1
28
- open! if @failures >= @failure_limit
30
+ mutex.write_lock { @failures += 1 }
31
+ open! if mutex.read_lock { @failures >= @failure_limit }
29
32
  end
30
33
 
31
34
  def half_open!
32
- @state = :half_open
35
+ mutex.write_lock { @state = :half_open }
33
36
  end
34
37
 
35
38
  def open!
36
- @state = :open
39
+ mutex.write_lock { @state = :open }
37
40
 
38
41
  EventMachine.add_timer(@recovery_time) { half_open! }
39
42
  end
40
43
 
41
44
  def close!
42
- @state = :closed
43
- @failures = 0
45
+ mutex.write_lock do
46
+ @state = :closed
47
+ @failures = 0
48
+ end
44
49
  end
45
50
  end
46
51
  end
@@ -1,5 +1,5 @@
1
1
  module EventMachine
2
2
  module CircuitBreaker
3
- VERSION = "0.1.0"
3
+ VERSION = "0.1.1"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eventmachine-circuit_breaker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Darren Coxall
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-10-26 00:00:00.000000000 Z
11
+ date: 2018-01-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: eventmachine
@@ -114,6 +114,7 @@ files:
114
114
  - eventmachine-circuit_breaker.gemspec
115
115
  - lib/eventmachine/circuit_breaker.rb
116
116
  - lib/eventmachine/circuit_breaker/breaker.rb
117
+ - lib/eventmachine/circuit_breaker/rw_mutex.rb
117
118
  - lib/eventmachine/circuit_breaker/strategy/basic.rb
118
119
  - lib/eventmachine/circuit_breaker/version.rb
119
120
  homepage: https://github.com/dcoxall/eventmachine-circuit_breaker