commit 3ca03ddcca8ed0b94cf3f175ef6724e5fa9dfec5
parent a3c59d2344cf7ac8a43c63b283a54362550444e9
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