Class: Chewy::Strategy::DelayedSidekiq

Inherits:
Sidekiq show all
Defined in:
lib/chewy/strategy/delayed_sidekiq.rb,
lib/chewy/strategy/delayed_sidekiq/worker.rb,
lib/chewy/strategy/delayed_sidekiq/scheduler.rb

Defined Under Namespace

Classes: Scheduler, Worker

Constant Summary collapse

LUA_SCRIPT =
<<~LUA
  local timechunk_key = KEYS[1]
  local timechunks_key = KEYS[2]
  local serialize_data = ARGV[1]
  local at = ARGV[2]
  local ttl = tonumber(ARGV[3])

  local schedule_job = false

  -- Check if the 'sadd?' method is available
  if redis.call('exists', 'sadd?') == 1 then
    redis.call('sadd?', timechunk_key, serialize_data)
  else
    redis.call('sadd', timechunk_key, serialize_data)
  end

  -- Set expiration for timechunk_key
  redis.call('expire', timechunk_key, ttl)

  -- Check if timechunk_key exists in the sorted set
  if not redis.call('zrank', timechunks_key, timechunk_key) then
      -- Add timechunk_key to the sorted set
      redis.call('zadd', timechunks_key, at, timechunk_key)
      -- Set expiration for timechunks_key
      redis.call('expire', timechunks_key, ttl)
      schedule_job = true
  end

  return schedule_job
LUA

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Atomic

#initialize, #update

Methods inherited from Base

#name, #update, #update_chewy_indices

Constructor Details

This class inherits a constructor from Chewy::Strategy::Atomic

Class Method Details

.clear_timechunks!Object

cleanup the redis sets used internally. Useful mainly in tests to avoid leak and potential flaky tests.



10
11
12
13
14
15
16
17
18
19
# File 'lib/chewy/strategy/delayed_sidekiq.rb', line 10

def self.clear_timechunks!
  ::Sidekiq.redis do |redis|
    keys_to_delete = redis.keys("#{Scheduler::KEY_PREFIX}*")

    # Delete keys one by one
    keys_to_delete.each do |key|
      redis.del(key)
    end
  end
end

Instance Method Details

#leaveObject



21
22
23
24
25
26
27
# File 'lib/chewy/strategy/delayed_sidekiq.rb', line 21

def leave
  @stash.each do |type, ids|
    next if ids.empty?

    DelayedSidekiq::Scheduler.new(type, ids).postpone
  end
end