As most of you probably know (or at least *should* know), removing a message from an IMAP mailstore is a two-step process. First the message has its \Deleted flag set with the STORE command, then any messages with this flag are expunged using either the EXPUNGE or CLOSE command. IMAP itself has no concept of a Trash folder. The Trash folder concept is something that is layered (some say hacked) on top of the delete+expunge model.

Since the most expensive part of the expunge process is actually unlink()ing the message files and rebuilding the cyrus.cache file, in the 2.3 branch of Cyrus we have implemented something we call "delayed expunge". With delayed expunge, the cyrus.index records of the expunged messages are moved to a cyrus.expunge file, but the message files and cyrus.cache records remain. This has the effect of removing the messages from the server (no message "exists" without a cyrus.index record), without all of the expensive overhead so the client gets more responsive behavior. The actual completion of the expunge is handled with the cyr_expire utility which is run periodically to unlink() the message files and rewrite the cyrus.cache file.

In addition to providing better performance for client, the fact that the message file and corresponding cache record are left behind provides a window of opportunity for an admin to go back and unexpunge messages if need be. To this end, I have written an unexpunge utility which simply restores the cyrus.index record of the expunged message to its original content. Keeping in mind that removing a message is a two-step process, the unexpunge utility (by default) only undoes the second step and reverts the message back to its "deleted but not yet expunged" state. This means that the \Deleted flag is still set, and depending upon the IMAP client configuration, may appear with an "X" icon, strikethrough text, or be hidden entirely. To help such clients, I have also implemented a -d option for the unexpunge utility which unsets the \Deleted flag when restoring the message.

So, my question is, what should the *default* behavior of unexpunge be:

A. only unexpunge the message and leave the \Deleted flag set as-is (only undo the expunge step)?

B. unexpunge the message and unset the \Deleted flag (undo both the expunge and delete steps)?


I'm of the opinion that A is the correct default behavior and admins can use the -d option as they see fit, but I will make the default behavior whatever the consensus ends up being.


--
Kenneth Murchison     Oceana Matrix Ltd.
Software Engineer     21 Princeton Place
716-662-8973 x26      Orchard Park, NY 14127
--PGP Public Key--    http://www.oceana.com/~ken/ksm.pgp
---
Cyrus Home Page: http://asg.web.cmu.edu/cyrus
Cyrus Wiki/FAQ: http://cyruswiki.andrew.cmu.edu
List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html

Reply via email to