mirror of
https://github.com/discourse/discourse.git
synced 2025-03-20 23:16:13 +08:00
FIX: 'cancel_scheduled_job' wasn't working due to sidekiq upgrade
This commit is contained in:
parent
68a69c213c
commit
737c606710
@ -238,30 +238,23 @@ module Jobs
|
|||||||
end
|
end
|
||||||
|
|
||||||
def self.cancel_scheduled_job(job_name, params={})
|
def self.cancel_scheduled_job(job_name, params={})
|
||||||
jobs = scheduled_for(job_name, params)
|
scheduled_for(job_name, params).each(&:delete)
|
||||||
return false if jobs.empty?
|
|
||||||
jobs.each { |job| job.delete }
|
|
||||||
true
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.scheduled_for(job_name, params={})
|
def self.scheduled_for(job_name, params={})
|
||||||
|
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|
|
Sidekiq::ScheduledSet.new.select do |scheduled_job|
|
||||||
if scheduled_job.klass == 'Sidekiq::Extensions::DelayedClass'
|
if scheduled_job.klass.to_s == job_class
|
||||||
job_args = YAML.load(scheduled_job.args[0])
|
matched = true
|
||||||
job_args_class, _, (job_args_params, *) = job_args
|
job_params = scheduled_job.item["args"][0].with_indifferent_access
|
||||||
if job_args_class.to_s == job_class && job_args_params
|
params.each do |key, value|
|
||||||
matched = true
|
if job_params[key] != value
|
||||||
params.each do |key, value|
|
matched = false
|
||||||
unless job_args_params[key] == value
|
break
|
||||||
matched = false
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
matched
|
|
||||||
else
|
|
||||||
false
|
|
||||||
end
|
end
|
||||||
|
matched
|
||||||
else
|
else
|
||||||
false
|
false
|
||||||
end
|
end
|
||||||
|
@ -208,7 +208,7 @@ class Topic < ActiveRecord::Base
|
|||||||
def cancel_auto_close_job
|
def cancel_auto_close_job
|
||||||
if (auto_close_at_changed? && !auto_close_at_was.nil?) || (auto_close_user_id_changed? && auto_close_at)
|
if (auto_close_at_changed? && !auto_close_at_was.nil?) || (auto_close_user_id_changed? && auto_close_at)
|
||||||
self.auto_close_started_at ||= Time.zone.now if auto_close_at
|
self.auto_close_started_at ||= Time.zone.now if auto_close_at
|
||||||
Jobs.cancel_scheduled_job(:close_topic, { topic_id: id })
|
Jobs.cancel_scheduled_job(:close_topic, topic_id: id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -74,5 +74,3 @@ end
|
|||||||
|
|
||||||
Sidekiq.error_handlers.clear
|
Sidekiq.error_handlers.clear
|
||||||
Sidekiq.error_handlers << SidekiqLogsterReporter.new
|
Sidekiq.error_handlers << SidekiqLogsterReporter.new
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
require "sidekiq/testing"
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
require_dependency 'jobs/base'
|
require_dependency 'jobs/base'
|
||||||
|
|
||||||
@ -76,23 +77,27 @@ describe Jobs do
|
|||||||
end
|
end
|
||||||
|
|
||||||
describe 'cancel_scheduled_job' do
|
describe 'cancel_scheduled_job' do
|
||||||
|
|
||||||
it 'deletes the matching job' do
|
it 'deletes the matching job' do
|
||||||
job_to_delete = stub_everything(klass: 'Sidekiq::Extensions::DelayedClass', args: [YAML.dump(['Jobs::DrinkBeer', :delayed_perform, [{beer_id: 42}]])])
|
SiteSetting.queue_jobs = true
|
||||||
job_to_delete.expects(:delete)
|
|
||||||
job_to_keep1 = stub_everything(klass: 'Sidekiq::Extensions::DelayedClass', args: [YAML.dump(['Jobs::DrinkBeer', :delayed_perform, [{beer_id: 43}]])])
|
Sidekiq::Testing.disable! do
|
||||||
job_to_keep1.expects(:delete).never
|
scheduled_jobs = Sidekiq::ScheduledSet.new
|
||||||
job_to_keep2 = stub_everything(klass: 'Sidekiq::Extensions::DelayedClass', args: [YAML.dump(['Jobs::DrinkBeer', :delayed_perform, [{beer_id: 44}]])])
|
scheduled_jobs.clear
|
||||||
job_to_keep2.expects(:delete).never
|
|
||||||
Sidekiq::ScheduledSet.stubs(:new).returns( [job_to_keep1, job_to_delete, job_to_keep2] )
|
expect(scheduled_jobs.size).to eq(0)
|
||||||
expect(Jobs.cancel_scheduled_job(:drink_beer, {beer_id: 42})).to eq(true)
|
|
||||||
|
Jobs.enqueue_in(1.year, :run_heartbeat, topic_id: 1234)
|
||||||
|
Jobs.enqueue_in(2.years, :run_heartbeat, topic_id: 5678)
|
||||||
|
|
||||||
|
expect(scheduled_jobs.size).to eq(2)
|
||||||
|
|
||||||
|
Jobs.cancel_scheduled_job(:run_heartbeat, topic_id: 1234)
|
||||||
|
|
||||||
|
expect(scheduled_jobs.size).to eq(1)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'returns false when no matching job is scheduled' do
|
|
||||||
job_to_keep = stub_everything(klass: 'Sidekiq::Extensions::DelayedClass', args: [YAML.dump(['Jobs::DrinkBeer', :delayed_perform, [{beer_id: 43}]])])
|
|
||||||
job_to_keep.expects(:delete).never
|
|
||||||
Sidekiq::ScheduledSet.stubs(:new).returns( [job_to_keep] )
|
|
||||||
expect(Jobs.cancel_scheduled_job(:drink_beer, {beer_id: 42})).to eq(false)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'enqueue_at' do
|
describe 'enqueue_at' do
|
||||||
|
Loading…
x
Reference in New Issue
Block a user