From f4672a9e052bc5e2c5ffd539eeb5b3bab4d568b9 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 12 Apr 2016 14:47:38 -0400 Subject: [PATCH] Instead of a Distributed Mutex, use a Redis SETNX guard --- app/jobs/onceoff.rb | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/app/jobs/onceoff.rb b/app/jobs/onceoff.rb index cb441484c8..cee3608902 100644 --- a/app/jobs/onceoff.rb +++ b/app/jobs/onceoff.rb @@ -5,18 +5,26 @@ class Jobs::Onceoff < Jobs::Base klass.name.sub(/^Jobs\:\:/, '') end + def running_key_name + "#{self.class.name}:running" + end + # Pass `force: true` to force it happen again def execute(args) job_name = self.class.name_for(self.class) + has_lock = $redis.setnx(running_key_name, Time.now.to_i) - if args[:force] || !OnceoffLog.where(job_name: job_name).exists? - return if $redis.exists(self.class.name) - DistributedMutex.synchronize(self.class.name) do + # If we can't get a lock, just noop + if args[:force] || has_lock + begin return if OnceoffLog.where(job_name: job_name).exists? && !args[:force] execute_onceoff(args) OnceoffLog.create(job_name: job_name) + ensure + $redis.del(running_key_name) if has_lock end end + end def self.enqueue_all