Class: Faulty::Storage::Memory
- Inherits:
-
Object
- Object
- Faulty::Storage::Memory
- Defined in:
- lib/faulty/storage/memory.rb
Overview
Add a more sophsticated implmentation that can limit the number of circuits stored.
The default in-memory storage for circuits
This implementation is thread-safe and circuit state is shared across threads. Since state is stored in-memory, this state is not shared across processes, or persisted across application restarts.
Circuit state and runs are stored in memory. Although runs have a maximum size within a circuit, there is no limit on the number of circuits that can be stored. This means the user should be careful about the number of circuits that are created. To that end, it's a good idea to avoid dynamically-named circuits with this backend.
For a more robust distributed implementation, use the Redis storage backend.
This can be used as a reference implementation for storage backends that store a list of circuit run entries.
Defined Under Namespace
Classes: MemoryCircuit, Options
Instance Attribute Summary collapse
-
#options ⇒ Object
readonly
Returns the value of attribute options.
Instance Method Summary collapse
-
#close(circuit) ⇒ Boolean
Mark a circuit as closed.
-
#entry(circuit, time, success) ⇒ Array<Array>
Add an entry to storage.
-
#fault_tolerant? ⇒ true
Memory storage is fault-tolerant by default.
-
#get_options(circuit) ⇒ Hash
Get the options stored for circuit.
-
#history(circuit) ⇒ Array<Array>
Get the circuit history up to
max_sample_size. -
#initialize(**options) {|Options| ... } ⇒ Memory
constructor
A new instance of Memory.
-
#list ⇒ Array<String>
Get a list of circuit names.
-
#lock(circuit, state) ⇒ void
Lock a circuit open or closed.
-
#open(circuit, opened_at) ⇒ Boolean
Mark a circuit as open.
-
#reopen(circuit, opened_at, previous_opened_at) ⇒ Boolean
Mark a circuit as reopened.
-
#reset(circuit) ⇒ void
Reset a circuit.
-
#set_options(circuit, stored_options) ⇒ void
Store the options for a circuit.
-
#status(circuit) ⇒ Status
Get the status of a circuit.
-
#unlock(circuit) ⇒ void
Unlock a circuit.
Constructor Details
#initialize(**options) {|Options| ... } ⇒ Memory
Returns a new instance of Memory.
74 75 76 77 |
# File 'lib/faulty/storage/memory.rb', line 74 def initialize(**, &block) @circuits = Concurrent::Map.new = Options.new(, &block) end |
Instance Attribute Details
#options ⇒ Object (readonly)
Returns the value of attribute options.
26 27 28 |
# File 'lib/faulty/storage/memory.rb', line 26 def end |
Instance Method Details
#close(circuit) ⇒ Boolean
Mark a circuit as closed
138 139 140 141 142 |
# File 'lib/faulty/storage/memory.rb', line 138 def close(circuit) memory = fetch(circuit) memory.runs.modify { |_old| [] } memory.state.compare_and_set(:open, :closed) end |
#entry(circuit, time, success) ⇒ Array<Array>
Add an entry to storage
102 103 104 105 106 107 108 109 |
# File 'lib/faulty/storage/memory.rb', line 102 def entry(circuit, time, success) memory = fetch(circuit) memory.runs.borrow do |runs| runs.push([time, success]) runs.shift if runs.size > .max_sample_size end memory.runs.value end |
#fault_tolerant? ⇒ true
Memory storage is fault-tolerant by default
201 202 203 |
# File 'lib/faulty/storage/memory.rb', line 201 def fault_tolerant? true end |
#get_options(circuit) ⇒ Hash
Get the options stored for circuit
84 85 86 |
# File 'lib/faulty/storage/memory.rb', line 84 def (circuit) fetch(circuit). end |
#history(circuit) ⇒ Array<Array>
Get the circuit history up to max_sample_size
187 188 189 |
# File 'lib/faulty/storage/memory.rb', line 187 def history(circuit) fetch(circuit).runs.value end |
#list ⇒ Array<String>
Get a list of circuit names
194 195 196 |
# File 'lib/faulty/storage/memory.rb', line 194 def list @circuits.keys end |
#lock(circuit, state) ⇒ void
This method returns an undefined value.
Lock a circuit open or closed
149 150 151 152 |
# File 'lib/faulty/storage/memory.rb', line 149 def lock(circuit, state) memory = fetch(circuit) memory.lock = state end |
#open(circuit, opened_at) ⇒ Boolean
Mark a circuit as open
116 117 118 119 120 121 |
# File 'lib/faulty/storage/memory.rb', line 116 def open(circuit, opened_at) memory = fetch(circuit) opened = memory.state.compare_and_set(:closed, :open) memory.opened_at.reset(opened_at) if opened opened end |
#reopen(circuit, opened_at, previous_opened_at) ⇒ Boolean
Mark a circuit as reopened
128 129 130 131 |
# File 'lib/faulty/storage/memory.rb', line 128 def reopen(circuit, opened_at, previous_opened_at) memory = fetch(circuit) memory.opened_at.compare_and_set(previous_opened_at, opened_at) end |
#reset(circuit) ⇒ void
This method returns an undefined value.
Reset a circuit
169 170 171 |
# File 'lib/faulty/storage/memory.rb', line 169 def reset(circuit) @circuits.delete(circuit.name) end |
#set_options(circuit, stored_options) ⇒ void
This method returns an undefined value.
Store the options for a circuit
93 94 95 |
# File 'lib/faulty/storage/memory.rb', line 93 def (circuit, ) fetch(circuit). = end |
#status(circuit) ⇒ Status
Get the status of a circuit
178 179 180 |
# File 'lib/faulty/storage/memory.rb', line 178 def status(circuit) fetch(circuit).status(circuit.) end |
#unlock(circuit) ⇒ void
This method returns an undefined value.
Unlock a circuit
159 160 161 162 |
# File 'lib/faulty/storage/memory.rb', line 159 def unlock(circuit) memory = fetch(circuit) memory.lock = nil end |