From: William Morgan Date: Thu, 7 Feb 2008 18:36:47 +0000 (-0800) Subject: maildir speedup: don't scan directory except when polling X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=3ca03ddcca8ed0b94cf3f175ef6724e5fa9dfec5;p=sup maildir speedup: don't scan directory except when polling --- diff --git a/lib/sup/maildir.rb b/lib/sup/maildir.rb index 7b85383..5c9600d 100644 --- a/lib/sup/maildir.rb +++ b/lib/sup/maildir.rb @@ -75,9 +75,11 @@ class Maildir < Source with_file_for(id) { |f| f.readlines.join } end - def scan_mailbox + def scan_mailbox opts={} + return unless @ids.empty? || opts[:rescan] return if @last_scan && (Time.now - @last_scan) < SCAN_INTERVAL + Redwood::log "scanning maildir..." cdir = File.join(@dir, 'cur') ndir = File.join(@dir, 'new') @@ -85,21 +87,21 @@ class Maildir < Source raise FatalSourceError, "#{ndir} not a directory" unless File.directory? ndir begin - @ids, @ids_to_fns = @mutex.synchronize do - ids, ids_to_fns = [], {} - (Dir[File.join(cdir, "*")] + Dir[File.join(ndir, "*")]).map do |fn| - id = make_id fn - ids << id - ids_to_fns[id] = fn - end - [ids.sort, ids_to_fns] + @ids, @ids_to_fns = [], {} + (Dir[File.join(cdir, "*")] + Dir[File.join(ndir, "*")]).map do |fn| + id = make_id fn + @ids << id + @ids_to_fns[id] = fn end + @ids.sort! rescue SystemCallError, IOError => e raise FatalSourceError, "Problem scanning Maildir directories: #{e.message}." end + Redwood::log "done scanning maildir" @last_scan = Time.now end + synchronized :scan_mailbox def each scan_mailbox @@ -120,7 +122,7 @@ class Maildir < Source end def end_offset - scan_mailbox + scan_mailbox :rescan => true @ids.last end