Sha256: b79e7a60e2473b1eaf2ed00dd0474d7e2231a20821278c1239129399f5fe3308
Contents?: true
Size: 1.22 KB
Versions: 1
Compression:
Stored size: 1.22 KB
Contents
module Interlock module Lock # # Try to acquire a global lock from memcached for a particular key. # If successful, yield and set the key to the return value, then release # the lock. # # Based on http://rubyurl.com/Sw7 , which I partially wrote. # def lock(key, lock_expiry = 30, retries = 5) retries.times do |count| # We have to be compatible with both client APIs. Eventually we can use Memcached#cas # for this. begin response = CACHE.add("lock:#{key}", "Locked by #{Process.pid}", lock_expiry) # Nil is a successful response for Memcached 0.11, and "STORED\r\n" for MemCache. response = [true, nil, "STORED\r\n"].include?(response) rescue Memcached::NotStored # Do nothing end if response begin value = yield(CACHE.get(key)) CACHE.set(key, value) return value ensure CACHE.delete("lock:#{key}") end else # Wait sleep((2**count) / 2.0) end end raise ::Interlock::LockAcquisitionError, "Couldn't acquire lock for #{key}" end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
interlock-1.4 | lib/interlock/lock.rb |