Sha256: c98fa92ce1ac12130f1db75bb259caa17aa21f73935d87f2c8f4f1c7a1e60597

Contents?: true

Size: 804 Bytes

Versions: 1

Compression:

Stored size: 804 Bytes

Contents

# Experimental LOCK support ported form http://github.com/fauna/interlock/tree/master/lib/interlock/lock.rb
module ActiveSupport
  module Cache
    class MemCacheStore < Store

      def lock(key, lock_expiry = 30, retries = 5)
        retries.times do |count|

          begin
            response = @data.add("lock:#{key}", "Locked by #{Process.pid}", lock_expiry)
            response ||= Response::STORED
          rescue Object => e
          end

          if response == Response::STORED
            begin
              value = yield( @data.get(key) )
              @data.set(key, value)
              return value
            ensure
              @data.delete("lock:#{key}")
            end
          else
            sleep((2**count) / 2.0)
          end
        end
      end

    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
ferblape-query_memcached-2.2.2 lib/extensions/lock.rb