@@ -174,11 +174,25 @@ def close(circuit)
174174 result = watch_exec ( key , [ 'open' ] ) do |m |
175175 m . set ( key , 'closed' , ex : ex )
176176 m . del ( entries_key ( circuit . name ) )
177+ m . del ( reserved_at_key ( circuit . name ) )
177178 end
178179
179180 result && result [ 0 ] == 'OK'
180181 end
181182
183+ # Reserve an exclusive run for this circuit
184+ #
185+ # @see Interface#reserve
186+ # @param (see Interface#reserve)
187+ # @return (see Interface#reserve)
188+ def reserve ( circuit , reserved_at , previous_reserved_at )
189+ key = reserved_at_key ( circuit . name )
190+ result = watch_exec ( key , [ previous_reserved_at . to_s ] ) do |m |
191+ m . set ( key , reserved_at , ex : options . circuit_ttl )
192+ end
193+ result && result [ 0 ] == 'OK'
194+ end
195+
182196 # Lock a circuit open or closed
183197 #
184198 # The circuit_ttl does not apply to locks
@@ -228,18 +242,21 @@ def status(circuit)
228242 futures [ :state ] = r . get ( state_key ( circuit . name ) )
229243 futures [ :lock ] = r . get ( lock_key ( circuit . name ) )
230244 futures [ :opened_at ] = r . get ( opened_at_key ( circuit . name ) )
245+ futures [ :reserved_at ] = r . get ( reserved_at_key ( circuit . name ) )
231246 futures [ :entries ] = r . lrange ( entries_key ( circuit . name ) , 0 , -1 )
232247 end
233248
234249 state = futures [ :state ] . value &.to_sym || :closed
235250 opened_at = futures [ :opened_at ] . value ? Float ( futures [ :opened_at ] . value ) : nil
236251 opened_at = Faulty . current_time - options . circuit_ttl if state == :open && opened_at . nil?
252+ opened_at = futures [ :reserved_at ] . value ? Float ( futures [ :reserved_at ] . value ) : nil
237253
238254 Faulty ::Status . from_entries (
239255 map_entries ( futures [ :entries ] . value ) ,
240256 state : state ,
241257 lock : futures [ :lock ] . value &.to_sym ,
242258 opened_at : opened_at ,
259+ reserved_at : reserved_at ,
243260 options : circuit . options
244261 )
245262 end
@@ -321,6 +338,11 @@ def opened_at_key(circuit_name)
321338 ckey ( circuit_name , 'opened_at' )
322339 end
323340
341+ # @return [String] The key for circuit opened_at
342+ def reserved_at_key ( circuit_name )
343+ ckey ( circuit_name , 'reserved_at' )
344+ end
345+
324346 # Get the current key to add circuit names to
325347 def list_key
326348 key ( 'list' , current_list_block )
0 commit comments