commit d41b9932497ec09e22eac939f4ad49d1b07b95a6
parent 59d812e8eddcc7dc07e87b3c04b0f875c1d9ad11
Author: William Morgan <wmorgan-sup@masanjin.net>
Date: Thu, 7 Feb 2008 10:36:47 -0800
maildir speedup: don't scan directory except when polling
Diffstat:
1 file changed, 12 insertions(+), 10 deletions(-)
diff --git 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