Created
November 28, 2016 05:12
-
-
Save balvig/20c503d188046617c86305353602f772 to your computer and use it in GitHub Desktop.
Removes duplicate jobs in resque
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class ResqueDeduplicator | |
attr_reader :logs | |
def initialize(queue) | |
@key = "queue:#{queue}" | |
@logs = [] | |
end | |
def run(dry_run: false) | |
duplicates.each do |duplicate| | |
if dry_run | |
log "DRY RUN: Will remove #{duplicate} from #{key}" | |
else | |
Resque.redis.lrem(key, -1, duplicate) | |
log "Removed #{duplicate} from #{key}" | |
end | |
end | |
end | |
def number_of_jobs | |
jobs.size | |
end | |
def number_of_duplicates | |
duplicates.size | |
end | |
private | |
attr_reader :key | |
def duplicates | |
@duplicates ||= begin | |
jobs_with_duplicates.map do |group| | |
group.last.drop(1) | |
end.flatten | |
end | |
end | |
def jobs_with_duplicates | |
jobs_grouped.select do |_, jobs| | |
jobs.size > 1 | |
end | |
end | |
def jobs_grouped | |
jobs.group_by do |job| | |
JSON.parse(job)["args"].first.except("job_id").to_s | |
end | |
end | |
def jobs | |
@jobs ||= Resque.redis.lrange(key, 0, -1) | |
end | |
def log(str) | |
logs << str | |
end | |
end | |
ResqueDeduplicator.new("job_queue_name") | |
dedup.run dry_run: false | |
dedup.logs.each { |log| puts log } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment