No subject
Mon Feb 25 18:59:26 EET 2013
while (rename(src, dest) < 0 && count < 2) {
if (errno != EEXIST) {
rename can never return EEXIST in errno. maildir-save.c, line 124.
/* move the file into new/ directory - syncing will pick it
up from there */
if (rename(tmp_path, new_path) == 0)
failed = FALSE;
Here you can lose emails if the new/ folder contains a message whose base
name is equal. The only way to avoid this is:
1) use link and unlink, not rename
2) leave messages that have a time_t part equal to or higher than
time(NULL).
Anyway, Maildir has a strict consistency criteria which says that all
messages that are linked from tmp/ into new/ _must_ use time(NULL) plus a
number that is guaranteed not to lapse within one second, and which does
not collide with other messages in new/. new/ is the single entry point
into cur/, and messages in new/ can not be "older" than the messages in
cur/.
The simple reasoning for this is that you can never guarantee that there
is no message in cur/ that has the same base name, but perhaps different
flags. It follows that when moving a message from new/ to cur/, it is
required that the server only picks messages that are older than one
second.
Andy
--
Andreas Aardal Hanssen
http://www.andreas.hanssen.name/gpg
More information about the dovecot
mailing list