From 0a1595579bff80ad0c1c3043834dbeabdb10641e Mon Sep 17 00:00:00 2001 From: Nick Zadrozny Date: Thu, 15 Mar 2012 16:03:24 -0700 Subject: [PATCH] Retry failed updates at least once after a 500ms delay. --- .../session_proxy/retry_fail_session_proxy.rb | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 sunspot/lib/sunspot/session_proxy/retry_fail_session_proxy.rb diff --git a/sunspot/lib/sunspot/session_proxy/retry_fail_session_proxy.rb b/sunspot/lib/sunspot/session_proxy/retry_fail_session_proxy.rb new file mode 100644 index 000000000..70709fd05 --- /dev/null +++ b/sunspot/lib/sunspot/session_proxy/retry_fail_session_proxy.rb @@ -0,0 +1,45 @@ +require File.join(File.dirname(__FILE__), 'abstract_session_proxy') + +module Sunspot + module SessionProxy + class RetryFailSessionProxy < AbstractSessionProxy + + attr_reader :search_session + + delegate :new_search, :search, :config, + :new_more_like_this, :more_like_this, + :delete_dirty, :delete_dirty?, + :to => :search_session + + def initialize(search_session = Sunspot.session) + @search_session = search_session + end + + def rescued_exception(method, e) + $stderr.puts("Exception in #{method}: #{e.message}") + end + + SUPPORTED_METHODS = [ + :batch, :commit, :commit_if_dirty, :commit_if_delete_dirty, :dirty?, + :index!, :index, :optimize, :remove!, :remove, :remove_all!, :remove_all, + :remove_by_id!, :remove_by_id + ] + + SUPPORTED_METHODS.each do |method| + module_eval(<<-RUBY) + def #{method}(*args, &block) + retry_count = 1 + begin + search_session.#{method}(*args, &block) + rescue => e + sleep 0.5 + self.rescued_exception(:#{method}, e) + retry if (retry_count -= 1) >= 0 + end + end + RUBY + end + + end + end +end