From 80cb133bb5fbb906e07780b7b1f5e9557ee0b7ff Mon Sep 17 00:00:00 2001 From: wmorgan Date: Thu, 4 Jan 2007 01:19:54 +0000 Subject: [PATCH] fixed imap error handling git-svn-id: svn://rubyforge.org/var/svn/sup/trunk@162 5c8cc53c-5e98-4d25-b20a-d8db53a31250 --- lib/sup/imap.rb | 19 +++++++++++++------ lib/sup/poll.rb | 17 ++++++++++------- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/lib/sup/imap.rb b/lib/sup/imap.rb index e250b2e..97c4a86 100644 --- a/lib/sup/imap.rb +++ b/lib/sup/imap.rb @@ -50,6 +50,8 @@ class IMAP < Source @labels << :inbox unless archived? @labels << mailbox.intern unless mailbox =~ /inbox/i @mutex = Mutex.new + + @recover_msg = "It is likely that messages have been deleted from this IMAP mailbox. Please run sup-import --rebuild #{to_s} to correct this problem." end def say s @@ -93,8 +95,7 @@ class IMAP < Source say "Reading headers (because IMAP sucks)..." values = @imap.fetch(1 .. last_id, ['RFC822.SIZE', 'INTERNALDATE']) - - say "Successfully connected to #{@parsed_uri}" + say "Successfully connected to #{@parsed_uri}." values.each do |v| id = make_id v @@ -104,7 +105,9 @@ class IMAP < Source rescue SocketError, Net::IMAP::Error, SourceError => e self.broken_msg = e.message.chomp # fucking chomp! fuck!!! @imap = nil - Redwood::log "error connecting to IMAP server: #{self.broken_msg}" + msg = "error connecting to IMAP server: #{self.broken_msg}" + Redwood::log msg + BufferManager.flash msg ensure shutup end @@ -154,11 +157,11 @@ class IMAP < Source def get_imap_field id, field retries = 0 f = nil - imap_id = @imap_ids[id] or raise SourceError, "Unknown message id #{id}. It is likely that messages have been deleted from this IMAP mailbox." + imap_id = @imap_ids[id] or raise SourceError, "Unknown message id #{id}. #@recover_msg" begin f = @imap.fetch imap_id, [field, 'RFC822.SIZE', 'INTERNALDATE'] got_id = make_id f[0] - raise SourceError, "IMAP message mismatch: requested #{id}, got #{got_id}. It is likely the IMAP mailbox has been modified." unless got_id == id + raise SourceError, "IMAP message mismatch: requested #{id}, got #{got_id}. #@recover_msg" unless got_id == id rescue Net::IMAP::Error => e raise SourceError, e.message rescue Errno::EPIPE @@ -178,7 +181,11 @@ class IMAP < Source @mutex.synchronize { connect or raise SourceError, broken_msg } start = @ids.index(cur_offset || start_offset) - start.upto(@ids.length - 1) do |i| + if start.nil? # couldn't find the most recent email + self.broken_msg = "Unknown message id #{cur_offset || start_offset}. #@recover_msg" + raise SourceError, broken_msg + end + start.upto(@ids.length - 1) do |i| id = @ids[i] self.cur_offset = id yield id, labels diff --git a/lib/sup/poll.rb b/lib/sup/poll.rb index 19e8d9f..b1dc6a7 100644 --- a/lib/sup/poll.rb +++ b/lib/sup/poll.rb @@ -54,10 +54,10 @@ class PollManager start_offset = nil num = 0 num_inbox = 0 - source.each do |offset, labels| - start_offset ||= offset - yield "Found message at #{offset} with labels #{labels * ', '}" - begin + begin + source.each do |offset, labels| + start_offset ||= offset + yield "Found message at #{offset} with labels #{labels * ', '}" m = Redwood::Message.new :source => source, :source_info => offset, :labels => labels if found[m.id] @@ -73,17 +73,20 @@ class PollManager total_num += 1 total_numi += 1 if m.labels.include? :inbox end - rescue SourceError, MessageFormatError => e - yield "Ignoring erroneous message at #{source}##{offset}: #{e.message}" end - + if num % 1000 == 0 && num > 0 elapsed = Time.now - start pctdone = (offset.to_f - start_offset) / (source.total.to_f - start_offset) remaining = (source.end_offset.to_f - offset.to_f) * (elapsed.to_f / (offset.to_f - start_offset)) yield "## #{num} (#{(pctdone * 100.0)}% done) read; #{elapsed.to_time_s} elapsed; est. #{remaining.to_time_s} remaining" end + rescue SourceError, MessageFormatError => e + msg = "#{source.broken? ? 'Fatal' : 'Non-fatal'} error loading from #{source}: #{e.message}" + Redwood::log msg + yield msg end + yield "Found #{num} messages" unless num == 0 end yield "Done polling; loaded #{total_num} new messages total" -- 2.45.2