module Dynflow::Executors::Sidekiq::RedisLocking

Constants

ACQUIRE_MISSING
ACQUIRE_OK
ACQUIRE_TAKEN
REACQUIRE_SCRIPT
REDIS_LOCK_KEY
REDIS_LOCK_POLL_INTERVAL
REDIS_LOCK_TTL
RELEASE_SCRIPT

Public Instance Methods

reacquire_orchestrator_lock() click to toggle source
# File lib/dynflow/executors/sidekiq/redis_locking.rb, line 55
def reacquire_orchestrator_lock
  case ::Sidekiq.redis { |conn| conn.eval REACQUIRE_SCRIPT, [REDIS_LOCK_KEY], [@world.id] }
  when ACQUIRE_MISSING
    @logger.error('The orchestrator lock was lost, reacquired')
  when ACQUIRE_TAKEN
    owner = ::Sidekiq.redis { |conn| conn.get REDIS_LOCK_KEY }
    @logger.fatal("The orchestrator lock was stolen by #{owner}, aborting.")
    Process.kill('INT', Process.pid)
  end
end
release_orchestrator_lock() click to toggle source
# File lib/dynflow/executors/sidekiq/redis_locking.rb, line 35
def release_orchestrator_lock
  ::Sidekiq.redis { |conn| conn.eval RELEASE_SCRIPT, [REDIS_LOCK_KEY], [@world.id] }
end
wait_for_orchestrator_lock() click to toggle source
# File lib/dynflow/executors/sidekiq/redis_locking.rb, line 39
def wait_for_orchestrator_lock
  mode = nil
  loop do
    active = ::Sidekiq.redis do |conn|
      conn.set(REDIS_LOCK_KEY, @world.id, :ex => REDIS_LOCK_TTL, :nx => true)
    end
    break if active
    if mode.nil?
      mode = :passive
      @logger.info('Orchestrator lock already taken, entering passive mode.')
    end
    sleep REDIS_LOCK_POLL_INTERVAL
  end
  @logger.info('Acquired orchestrator lock, entering active mode.')
end