FIX: Jobs.cancel_scheduled_job wasn't working anymore due to our move to using multiple queues

FIX: Don't queue more than 1 'update_gravatar' job per user
This commit is contained in:
Régis Hanol 2016-04-13 18:12:28 +02:00
parent b782a01148
commit b7c16991f7
3 changed files with 20 additions and 14 deletions

View File

@ -244,7 +244,10 @@ module Jobs
def self.scheduled_for(job_name, params={}) def self.scheduled_for(job_name, params={})
params = params.with_indifferent_access params = params.with_indifferent_access
job_class = "Jobs::#{job_name.to_s.camelcase}" job_class = "Jobs::#{job_name.to_s.camelcase}"
Sidekiq::ScheduledSet.new.select do |scheduled_job|
scheduled_jobs = []
Sidekiq::Queue.all.each do |queue|
queue.each do |scheduled_job|
if scheduled_job.klass.to_s == job_class if scheduled_job.klass.to_s == job_class
matched = true matched = true
job_params = scheduled_job.item["args"][0].with_indifferent_access job_params = scheduled_job.item["args"][0].with_indifferent_access
@ -254,12 +257,13 @@ module Jobs
break break
end end
end end
matched scheduled_jobs << scheduled_job if matched
else
false
end end
end end
end end
scheduled_jobs
end
end end
Dir["#{Rails.root}/app/jobs/onceoff/*.rb"].each {|file| require_dependency file } Dir["#{Rails.root}/app/jobs/onceoff/*.rb"].each {|file| require_dependency file }

View File

@ -7,9 +7,10 @@ module Jobs
UserAvatar.includes(:user) UserAvatar.includes(:user)
.where(last_gravatar_download_attempt: nil) .where(last_gravatar_download_attempt: nil)
.order("users.last_posted_at DESC") .order("users.last_posted_at DESC")
.limit(5000) .find_in_batches(batch_size: 5000) do |user_avatars|
.each do |u| user_avatars.each do |user_avatar|
u.user.refresh_avatar user_avatar.user.refresh_avatar
end
end end
end end
end end

View File

@ -753,6 +753,7 @@ class User < ActiveRecord::Base
avatar = user_avatar || create_user_avatar avatar = user_avatar || create_user_avatar
if SiteSetting.automatically_download_gravatars? && !avatar.last_gravatar_download_attempt if SiteSetting.automatically_download_gravatars? && !avatar.last_gravatar_download_attempt
Jobs.cancel_scheduled_job(:update_gravatar, user_id: self.id, avatar_id: avatar.id)
Jobs.enqueue(:update_gravatar, user_id: self.id, avatar_id: avatar.id) Jobs.enqueue(:update_gravatar, user_id: self.id, avatar_id: avatar.id)
end end