aboutsummaryrefslogtreecommitdiffstats
path: root/activejob
diff options
context:
space:
mode:
authorRosa Gutierrez <rosa.ge@gmail.com>2019-01-07 17:18:17 +0100
committerRosa Gutierrez <rosa.ge@gmail.com>2019-01-08 12:08:06 +0100
commitacbbd4ab8d3c51ca464a97245c4d7709259472f9 (patch)
tree455cb33c2a22bcee4489280de51cdc24b76b67f6 /activejob
parent154057b4f7d8bcf37637ec7185ede3c4d0cd6583 (diff)
downloadrails-acbbd4ab8d3c51ca464a97245c4d7709259472f9.tar.gz
rails-acbbd4ab8d3c51ca464a97245c4d7709259472f9.tar.bz2
rails-acbbd4ab8d3c51ca464a97245c4d7709259472f9.zip
Ensure 0 is always the default for the individual exception counters in ActiveJob
Some adapters like Resque that use Redis, convert the Ruby hash with a default value, Hash.new(0), into a regular hash without a default value after serializing, storing and deserializing. This raises an error when we try to access a missing exception key. A simple solution is not to rely on the hash's default value, and provide a default as alternative when accessing it instead.
Diffstat (limited to 'activejob')
-rw-r--r--activejob/lib/active_job/core.rb2
-rw-r--r--activejob/lib/active_job/exceptions.rb4
2 files changed, 3 insertions, 3 deletions
diff --git a/activejob/lib/active_job/core.rb b/activejob/lib/active_job/core.rb
index 4ab62f89b0..487cdd6d38 100644
--- a/activejob/lib/active_job/core.rb
+++ b/activejob/lib/active_job/core.rb
@@ -81,7 +81,7 @@ module ActiveJob
@queue_name = self.class.queue_name
@priority = self.class.priority
@executions = 0
- @exception_executions = Hash.new(0)
+ @exception_executions = {}
end
# Returns a hash with the job data that can safely be passed to the
diff --git a/activejob/lib/active_job/exceptions.rb b/activejob/lib/active_job/exceptions.rb
index 48b35c8d05..9e00942a1c 100644
--- a/activejob/lib/active_job/exceptions.rb
+++ b/activejob/lib/active_job/exceptions.rb
@@ -50,8 +50,8 @@ module ActiveJob
def retry_on(*exceptions, wait: 3.seconds, attempts: 5, queue: nil, priority: nil)
rescue_from(*exceptions) do |error|
# Guard against jobs that were persisted before we started having individual executions counters per retry_on
- self.exception_executions ||= Hash.new(0)
- self.exception_executions[exceptions.to_s] += 1
+ self.exception_executions ||= {}
+ self.exception_executions[exceptions.to_s] = (exception_executions[exceptions.to_s] || 0) + 1
if exception_executions[exceptions.to_s] < attempts
retry_job wait: determine_delay(wait), queue: queue, priority: priority, error: error