class SidekiqUniqueJobs::BatchDelete


@author Mikael Henriksson <mikael@zoolutions.se>
Class BatchDelete provides batch deletion of digests

def self.call(digests, conn)

Returns:
  • (void) -

Parameters:
  • conn (Redis) -- the connection to use for deletion
  • digests (Array) -- the digests to delete
def self.call(digests, conn)
  new(digests, conn).call
end

def batch_delete(conn)

Returns:
  • (Integer) - the number of deleted digests
def batch_delete(conn)
  digests.each_slice(BATCH_SIZE) do |chunk|
    conn.pipelined do
      chunk.each do |digest|
        del_digest(conn, digest)
        conn.zrem(SidekiqUniqueJobs::DIGESTS, digest)
        @count += 1
      end
    end
  end
  @count
end

def call

Other tags:
    Note: - Just wraps batch_delete to be able to provide no connection
def call
  return log_info("Nothing to delete; exiting.") if digests.none?
  log_info("Deleting batch with #{digests.size} digests")
  return batch_delete(conn) if conn
  redis { |rcon| batch_delete(rcon) }
end

def del_digest(conn, digest)

def del_digest(conn, digest)
  removable_keys = keys_for_digest(digest)
  if VersionCheck.satisfied?(redis_version, ">= 4.0.0")
    conn.unlink(*removable_keys)
  else
    conn.del(*removable_keys)
  end
end

def initialize(digests, conn)

Parameters:
  • conn (Redis) -- the connection to use for deletion
  • digests (Array) -- the digests to delete
def initialize(digests, conn)
  @count   = 0
  @digests = digests
  @conn    = conn
  @digests ||= []
  @digests.compact!
  redis_version # Avoid pipelined calling redis_version and getting a future.
end

def keys_for_digest(digest)

def keys_for_digest(digest)
  [digest, "#{digest}:RUN"].each_with_object([]) do |key, digest_keys|
    digest_keys.concat([key])
    digest_keys.concat(SUFFIXES.map { |suffix| "#{key}:#{suffix}" })
  end
end

def redis_version

def redis_version
  @redis_version ||= SidekiqUniqueJobs.config.redis_version
end