lib/services/modules/uniqueness_checker.rb in services-0.2.11 vs lib/services/modules/uniqueness_checker.rb in services-0.2.12
- old
+ new
@@ -25,25 +25,23 @@
@uniqueness_args = args.empty? ? @service_args : args
new_uniqueness_key = uniqueness_key(@uniqueness_args)
raise "A uniqueness key with args #{@uniqueness_args.inspect} already exists." if @uniqueness_keys && @uniqueness_keys.include?(new_uniqueness_key)
if @similar_service_id = Services.configuration.redis.get(new_uniqueness_key)
case on_error.to_sym
- when :ignore
- false
when :fail
raise_non_unique_error
when :reschedule
- error_count = (Services.configuration.redis.get(error_count_key) || 0).to_i
- if error_count >= MAX_RETRIES
+ @error_count = (Services.configuration.redis.get(error_count_key) || 0).to_i
+ if @error_count >= MAX_RETRIES
raise_non_unique_error
else
- error_count += 1
- self.class.perform_in retry_delay(error_count), *@service_args
- Services.configuration.redis.setex error_count_key, retry_delay(error_count) + ONE_HOUR, error_count
- false
+ @error_count += 1
+ reschedule
+ Services.configuration.redis.setex error_count_key, retry_delay + ONE_HOUR, @error_count
end
end
+ false
else
@uniqueness_keys ||= []
@uniqueness_keys << new_uniqueness_key
Services.configuration.redis.setex new_uniqueness_key, ONE_HOUR, @id
true
@@ -64,10 +62,25 @@
message = "Service #{self.class} #{@id} with uniqueness args #{@uniqueness_args} is not unique, a similar service is already running: #{@similar_service_id}."
message << " The service has been retried #{MAX_RETRIES} times."
raise self.class::NotUniqueError, message
end
+ def reschedule
+ # Convert service args to fixnums first
+ reschedule_args = @service_args.map do |arg|
+ case arg
+ when Fixnum, String, TrueClass, FalseClass, NilClass
+ arg
+ when service_class && arg.respond_to?(:id)
+ arg.id
+ else
+ raise "Don't know how to convert arg #{arg.inspect} for rescheduling."
+ end
+ end
+ self.class.perform_in retry_delay, *reschedule_args
+ end
+
def uniqueness_key(args)
[
KEY_PREFIX,
self.class.to_s
].tap do |key|
@@ -83,11 +96,11 @@
].tap do |key|
key << Digest::MD5.hexdigest(@service_args.to_s) unless @service_args.empty?
end.join(':')
end
- def retry_delay(error_count)
- (error_count ** 3) + 5
+ def retry_delay
+ (@error_count ** 3) + 5
end
end
end
end