Class: SidekiqUniqueJobs::Lock::WhileExecuting

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

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(item, redis_pool = nil) ⇒ WhileExecuting

Returns a new instance of WhileExecuting.



8
9
10
11
12
13
# File 'lib/sidekiq_unique_jobs/lock/while_executing.rb', line 8

def initialize(item, redis_pool = nil)
  @item = item
  @mutex = Mutex.new
  @redis_pool = redis_pool
  @unique_digest = "#{create_digest}:run"
end

Class Method Details

.synchronize(item, redis_pool = nil) ⇒ Object



4
5
6
# File 'lib/sidekiq_unique_jobs/lock/while_executing.rb', line 4

def self.synchronize(item, redis_pool = nil)
  new(item, redis_pool).synchronize { yield }
end

Instance Method Details

#create_digestObject



36
37
38
39
# File 'lib/sidekiq_unique_jobs/lock/while_executing.rb', line 36

def create_digest
  @unique_digest ||= @item[UNIQUE_DIGEST_KEY]
  @unique_digest ||= SidekiqUniqueJobs::UniqueArgs.digest(@item)
end

#execute(_callback) ⇒ Object



30
31
32
33
34
# File 'lib/sidekiq_unique_jobs/lock/while_executing.rb', line 30

def execute(_callback)
  synchronize do
    yield
  end
end

#locked?Boolean

Returns:

  • (Boolean)


26
27
28
# File 'lib/sidekiq_unique_jobs/lock/while_executing.rb', line 26

def locked?
  Scripts.call(:synchronize, @redis_pool, keys: [@unique_digest], argv: [Time.now.to_i]) == 1
end

#synchronizeObject



15
16
17
18
19
20
21
22
23
24
# File 'lib/sidekiq_unique_jobs/lock/while_executing.rb', line 15

def synchronize
  @mutex.lock
  sleep 0.001 until locked?

  yield

ensure
  SidekiqUniqueJobs.connection(@redis_pool) { |c| c.del @unique_digest }
  @mutex.unlock
end