Class: MiniScheduler::DistributedMutex

Inherits:
Object
  • Object
show all
Defined in:
lib/mini_scheduler/distributed_mutex.rb

Defined Under Namespace

Classes: Timeout

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(key, redis) ⇒ DistributedMutex

Returns a new instance of DistributedMutex.

Raises:

  • (ArgumentError)


17
18
19
20
21
22
# File 'lib/mini_scheduler/distributed_mutex.rb', line 17

def initialize(key, redis)
  raise ArgumentError.new('redis argument is nil') if redis.nil?
  @key = key
  @redis = redis
  @mutex = Mutex.new
end

Class Method Details

.redis=(redis) ⇒ Object



9
10
11
# File 'lib/mini_scheduler/distributed_mutex.rb', line 9

def self.redis=(redis)
  @default_redis = redis
end

.synchronize(key, redis = nil, &blk) ⇒ Object



13
14
15
# File 'lib/mini_scheduler/distributed_mutex.rb', line 13

def self.synchronize(key, redis = nil, &blk)
  self.new(key, redis || @default_redis).synchronize(&blk)
end

Instance Method Details

#synchronizeObject

NOTE wrapped in mutex to maintain its semantics



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/mini_scheduler/distributed_mutex.rb', line 29

def synchronize
  @mutex.lock

  attempts = 0
  sleep_duration = BASE_SLEEP_DURATION
  while !try_to_get_lock

    sleep(sleep_duration)

    if sleep_duration < MAX_SLEEP_DURATION
      sleep_duration = [sleep_duration * 2, MAX_SLEEP_DURATION].min
    end

    attempts += 1
    raise Timeout if attempts >= MAX_POLLING_ATTEMPTS
  end

  yield

ensure
  @redis.del @key
  @mutex.unlock
end