Sha256: 213ea0b6b1745c98252af8b3702d5b47c60a0f8fbb21bfde9c89a4382001a055

Contents?: true

Size: 1.04 KB

Versions: 3

Compression:

Stored size: 1.04 KB

Contents

require 'uuid'

module Etcd
  class Lock
    class AcqusitionFailure < StandardError; end
    class ReleaseFailure < StandardError; end


    attr_reader :lock_id, :key, :value, :client
    attr_reader :retries, :retry_interval, :attempts


    def initialize(opts={})
      @client = opts[:client]
      @key = opts[:key] || '/global/lock' 
      @value = opts[:value] || 0
      @retries = opts[:retries] || 1
      @retry_interval = opts[:retry_interval] || 1
      @attempts = 0
    end

    def acquire
      @lock_id =  uuid.generate
      begin
        response = client.test_and_set(key, lock_id, value)
        @attempts = 0
        response
      rescue Exception => e  
        @attempts += 1
        raise AcqusitionFailure, e.message if attempts >= retries
        sleep retry_interval
        acquire
      end
    end

    def release
      begin
        response = client.test_and_set(key, value, lock_id)
      rescue Exception => e
        raise ReleaseFailure, e.message
      end
    end

    def uuid
      @uuid ||= UUID.new
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
etcd-0.0.6 lib/etcd/lock.rb
etcd-0.0.5 lib/etcd/lock.rb
etcd-0.0.4 lib/etcd/lock.rb