Class: Cirrus::Lock

Inherits:
Object
  • Object
show all
Defined in:
lib/cirrus/lock.rb

Constant Summary collapse

LOCKED =
"cirrus:locked"
LOCKS =
"cirrus:locks"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(redis, *values) ⇒ Lock

Returns a new instance of Lock.



7
8
9
10
11
12
# File 'lib/cirrus/lock.rb', line 7

def initialize(redis, *values)
  @redis  = redis

  @id     = SecureRandom.hex(8)
  @values = values
end

Instance Attribute Details

#idObject

Returns the value of attribute id.



2
3
4
# File 'lib/cirrus/lock.rb', line 2

def id
  @id
end

#redisObject

Returns the value of attribute redis.



2
3
4
# File 'lib/cirrus/lock.rb', line 2

def redis
  @redis
end

#valuesObject

Returns the value of attribute values.



2
3
4
# File 'lib/cirrus/lock.rb', line 2

def values
  @values
end

Instance Method Details

#locked?Boolean

Returns:

  • (Boolean)


32
33
34
35
36
37
38
# File 'lib/cirrus/lock.rb', line 32

def locked?
  redis.multi do
    values.each do |value|
      redis.sismember(LOCKED, value)
    end
  end.any? { |result| result == true }
end

#releaseObject



22
23
24
25
26
27
28
29
30
# File 'lib/cirrus/lock.rb', line 22

def release
  releasable_ids = redis.smembers(pointer)

  redis.multi do
    redis.srem(pointer, releasable_ids)
    redis.srem(LOCKED, values)
    redis.srem(LOCKS, id)
  end.all? { |result| result.is_a?(Integer) ? result > 0 : result == true }
end

#setObject



14
15
16
17
18
19
20
# File 'lib/cirrus/lock.rb', line 14

def set
  redis.multi do
    redis.sadd(LOCKS, id)
    redis.sadd(LOCKED, values)
    redis.sadd(pointer, values)
  end.all? { |result| result.is_a?(Integer) ? result > 0 : result == true }
end