class SidekiqUniqueJobs::BatchDelete
@author Mikael Henriksson <mikael@zoolutions.se>
Class BatchDelete provides batch deletion of digests
def self.call(digests, conn)
-
(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)
-
(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
- 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)
-
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