diff --git a/lib/feed_handler.rb b/lib/feed_handler.rb index 3617a8f..5d070e7 100644 --- a/lib/feed_handler.rb +++ b/lib/feed_handler.rb @@ -17,8 +17,10 @@ class FeedHandler # The maximum number cattr_accessor :max_errors + cattr_accessor :disabled_period self.max_errors = 6 + self.disabled_period = 1.week def parse(content) raise FeedHandler::ParseError, "Content is nil" if content.nil? @@ -52,6 +54,12 @@ class FeedHandler RAILS_DEFAULT_LOGGER.info("Processing %s with id = %d" % [container.class.name, container.id]) begin container.class.transaction do + if container.update_errors > FeedHandler.max_errors && container.fetched_at < (Time.now - FeedHandler.disabled_period) then + container.enabled = true + container.update_errors = 0 + container.save + end + next unless container.enabled actually_process_container(container) container.update_errors = 0 container.finish_fetch @@ -63,6 +71,7 @@ class FeedHandler container.update_errors += 1 container.error_message = exception.to_s if container.update_errors > FeedHandler.max_errors + container.fetched_at = Time.now container.enabled = false end begin diff --git a/lib/feed_updater.rb b/lib/feed_updater.rb index 2382e02..7a9f7ec 100644 --- a/lib/feed_updater.rb +++ b/lib/feed_updater.rb @@ -72,7 +72,7 @@ class FeedUpdater if !running break end - source.enabled.expired.all.each do |container| + source.expired.all.each do |container| if !running break end diff --git a/test/unit/feed_handler_test.rb b/test/unit/feed_handler_test.rb index 81a5c69..406b654 100644 --- a/test/unit/feed_handler_test.rb +++ b/test/unit/feed_handler_test.rb @@ -112,6 +112,22 @@ class FeedHandlerTest < ActiveSupport::TestCase assert !container.error_message.blank?, 'must set error message in container after errors (%s)' % container_class assert !container.enabled, 'must disable continer after errors (%s)' % container_class end + + should "reenable after (#{container_class})" do + FeedHandler.stubs(:max_errors).returns(4) + + container = create(container_class) + handler.stubs(:actually_process_container).with(container).raises(Exception.new("crash")) + # exceeds max_errors + 5.times { handler.process(container) } + + # after disabled period, tries to process the container again + last_error = Time.now + Time.stubs(:now).returns(last_error + FeedHandler.disabled_period + 1.second) + handler.process(container) + + assert container.enabled, 'must reenable container after (%s)' % container_class + end end should 'not crash even when finish fetch fails' do -- libgit2 0.21.2