class SidekiqUniqueJobs::BatchDelete
Class BatchDelete
provides batch deletion of digests
@author Mikael Henriksson <mikael@mhenrixon.com>
Constants
- BATCH_SIZE
-
@return [Integer] the default batch size
- SUFFIXES
-
@return [Array<String>] Supported key suffixes
Attributes
@!attribute [r] conn
@return [Redis, RedisConnection, ConnectionPool] a redis connection
@!attribute [r] digests
@return [Array<String>] a collection of digests to be deleted
Public Class Methods
Source
# File lib/sidekiq_unique_jobs/batch_delete.rb, line 47 def self.call(digests, conn = nil) new(digests, conn).call end
Executes a batch deletion of the provided digests
@param [Array<String>] digests the digests to delete @param [Redis] conn the connection to use for deletion
@return [void]
Source
# File lib/sidekiq_unique_jobs/batch_delete.rb, line 57 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
Initialize a new batch delete instance
@param [Array<String>] digests the digests to delete @param [Redis] conn the connection to use for deletion
Public Instance Methods
Source
# File lib/sidekiq_unique_jobs/batch_delete.rb, line 71 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
Executes a batch deletion of the provided digests @note Just wraps batch_delete
to be able to provide no connection
Private Instance Methods
Source
# File lib/sidekiq_unique_jobs/batch_delete.rb, line 88 def batch_delete(conn) digests.each_slice(BATCH_SIZE) do |chunk| conn.pipelined do |pipeline| chunk.each do |digest| del_digest(pipeline, digest) pipeline.zrem(SidekiqUniqueJobs::DIGESTS, digest) pipeline.zrem(SidekiqUniqueJobs::EXPIRING_DIGESTS, digest) @count += 1 end end end @count end
Does the actual batch deletion
@return [Integer] the number of deleted digests
Source
# File lib/sidekiq_unique_jobs/batch_delete.rb, line 103 def del_digest(pipeline, digest) removable_keys = keys_for_digest(digest) pipeline.unlink(*removable_keys) end
Source
# File lib/sidekiq_unique_jobs/batch_delete.rb, line 109 def keys_for_digest(digest) [digest, "#{digest}:RUN"].each_with_object([]) do |key, digest_keys| digest_keys.push(key) digest_keys.concat(SUFFIXES.map { |suffix| "#{key}:#{suffix}" }) end end
Source
# File lib/sidekiq_unique_jobs/batch_delete.rb, line 116 def redis_version @redis_version ||= SidekiqUniqueJobs.config.redis_version end