lib/idempo/memory_backend.rb in idempo-1.1.0 vs lib/idempo/memory_backend.rb in idempo-1.2.1
- old
+ new
@@ -1,14 +1,11 @@
class Idempo::MemoryBackend
def initialize
- require "set"
require_relative "response_store"
-
- @requests_in_flight_mutex = Mutex.new
- @in_progress = Set.new
- @store_mutex = Mutex.new
+ @lock = Idempo::MemoryLock.new
@response_store = Idempo::ResponseStore.new
+ @store_mutex = Mutex.new
end
class Store < Struct.new(:store_mutex, :response_store, :key, keyword_init: true)
def lookup
store_mutex.synchronize do
@@ -22,25 +19,12 @@
end
end
end
def with_idempotency_key(request_key)
- did_insert = @requests_in_flight_mutex.synchronize do
- if @in_progress.include?(request_key)
- false
- else
- @in_progress << request_key
- true
- end
- end
-
- raise Idempo::ConcurrentRequest unless did_insert
-
- store = Store.new(store_mutex: @store_mutex, response_store: @response_store, key: request_key)
- begin
+ @lock.with(request_key) do
+ store = Store.new(store_mutex: @store_mutex, response_store: @response_store, key: request_key)
yield(store)
- ensure
- @requests_in_flight_mutex.synchronize { @in_progress.delete(request_key) }
end
end
def prune!
@response_store.prune