2019-05-02 18:17:27 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2019-10-02 00:01:53 -04:00
|
|
|
class Jobs::Onceoff < ::Jobs::Base
|
2016-04-07 14:32:31 -04:00
|
|
|
sidekiq_options retry: false
|
|
|
|
|
2024-07-25 01:30:56 -04:00
|
|
|
class << self
|
2024-07-25 03:52:42 -04:00
|
|
|
@@onceoff_job_klasses = Set.new
|
2024-07-25 01:30:56 -04:00
|
|
|
|
|
|
|
def inherited(klass)
|
2024-07-25 03:52:42 -04:00
|
|
|
@@onceoff_job_klasses << klass
|
|
|
|
end
|
|
|
|
|
|
|
|
def onceoff_job_klasses
|
|
|
|
@@onceoff_job_klasses
|
2024-07-25 01:30:56 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-04-07 14:32:31 -04:00
|
|
|
def self.name_for(klass)
|
2023-01-20 13:52:49 -05:00
|
|
|
klass.name.sub(/\AJobs\:\:/, "")
|
2016-04-07 14:32:31 -04:00
|
|
|
end
|
|
|
|
|
2016-04-12 14:47:38 -04:00
|
|
|
def running_key_name
|
|
|
|
"#{self.class.name}:running"
|
|
|
|
end
|
|
|
|
|
2016-04-07 14:32:31 -04:00
|
|
|
# Pass `force: true` to force it happen again
|
|
|
|
def execute(args)
|
|
|
|
job_name = self.class.name_for(self.class)
|
2019-12-03 04:05:53 -05:00
|
|
|
has_lock = Discourse.redis.setnx(running_key_name, Time.now.to_i)
|
2016-04-07 14:32:31 -04:00
|
|
|
|
2016-04-12 14:47:38 -04:00
|
|
|
# If we can't get a lock, just noop
|
|
|
|
if args[:force] || has_lock
|
|
|
|
begin
|
2016-04-12 09:08:10 -04:00
|
|
|
return if OnceoffLog.where(job_name: job_name).exists? && !args[:force]
|
2016-04-07 15:07:24 -04:00
|
|
|
execute_onceoff(args)
|
2018-09-19 06:22:54 -04:00
|
|
|
OnceoffLog.create!(job_name: job_name)
|
2016-04-12 14:47:38 -04:00
|
|
|
ensure
|
2019-12-03 04:05:53 -05:00
|
|
|
Discourse.redis.del(running_key_name) if has_lock
|
2016-04-07 15:07:24 -04:00
|
|
|
end
|
2016-04-07 14:32:31 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.enqueue_all
|
2016-04-07 15:07:24 -04:00
|
|
|
previously_ran = OnceoffLog.pluck(:job_name).uniq
|
|
|
|
|
2024-07-25 01:30:56 -04:00
|
|
|
self.onceoff_job_klasses.each do |klass|
|
|
|
|
job_name = name_for(klass)
|
|
|
|
Jobs.enqueue(job_name.underscore.to_sym) if previously_ran.exclude?(job_name)
|
|
|
|
end
|
2016-04-07 14:32:31 -04:00
|
|
|
end
|
|
|
|
end
|