diff options
author | Andrew M. Kuchling <amk@amk.ca> | 2009-05-02 19:17:28 +0000 |
---|---|---|
committer | Andrew M. Kuchling <amk@amk.ca> | 2009-05-02 19:17:28 +0000 |
commit | 98f94d768a71aa8aa6000eed19e9465d24be330e (patch) | |
tree | 59d52dba927db07dd1d895af0efa687562b6a2eb /Lib/mailbox.py | |
parent | 37b291928c75bb5f3a42ff9b66f96d0136a3aecc (diff) | |
download | cpython-98f94d768a71aa8aa6000eed19e9465d24be330e.tar.gz |
#1607951: Make mailbox.Maildir re-read the directories less frequently.
This is done by recording the current time -1sec, and not re-reading unless
the directory mod. times are >= the recorded time.
Diffstat (limited to 'Lib/mailbox.py')
-rwxr-xr-x | Lib/mailbox.py | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/Lib/mailbox.py b/Lib/mailbox.py index 7e0689c488..380f288f0d 100755 --- a/Lib/mailbox.py +++ b/Lib/mailbox.py @@ -237,6 +237,7 @@ class Maildir(Mailbox): else: raise NoSuchMailboxError(self._path) self._toc = {} + self._last_read = None # Records last time we read cur/new def add(self, message): """Add message and return assigned key.""" @@ -461,16 +462,35 @@ class Maildir(Mailbox): def _refresh(self): """Update table of contents mapping.""" + new_mtime = os.path.getmtime(os.path.join(self._path, 'new')) + cur_mtime = os.path.getmtime(os.path.join(self._path, 'cur')) + + if (self._last_read is not None and + new_mtime <= self._last_read and cur_mtime <= self._last_read): + return + self._toc = {} - for subdir in ('new', 'cur'): - subdir_path = os.path.join(self._path, subdir) - for entry in os.listdir(subdir_path): - p = os.path.join(subdir_path, entry) + def update_dir (subdir): + path = os.path.join(self._path, subdir) + for entry in os.listdir(path): + p = os.path.join(path, entry) if os.path.isdir(p): continue uniq = entry.split(self.colon)[0] self._toc[uniq] = os.path.join(subdir, entry) + update_dir('new') + update_dir('cur') + + # We record the current time - 1sec so that, if _refresh() is called + # again in the same second, we will always re-read the mailbox + # just in case it's been modified. (os.path.mtime() only has + # 1sec resolution.) This results in a few unnecessary re-reads + # when _refresh() is called multiple times in the same second, + # but once the clock ticks over, we will only re-read as needed. + now = int(time.time() - 1) + self._last_read = time.time() - 1 + def _lookup(self, key): """Use TOC to return subpath for given key, or raise a KeyError.""" try: |