I'm running Dovecot 2.3.21 with the mdbox mailbox format. I lose mails (with an asterisk, see below) when I'm doing the following in 2 IMAP sessions:
Session 1: Create a folder, save a mail and select it:
. create folder . append folder {1} . select folder
- 1 EXISTS
- OK [UIDVALIDITY 1734013510] UIDs valid
Session 2: Delete the folder, create it again, save a mail in it, check the number of messages and the uidvalidity:.
. delete folder . create folder . append folder {1} . status folder (messages uidvalidity)
- STATUS folder (MESSAGES 1 UIDVALIDITY 1734013511)
Everything is as expected until here, the uidvalidity was increased by 1, which makes sense.
Session 1: Just do a noop
. noop
- BYE IMAP session state is inconsistent, please relogin.
Dovecot notices that something is wrong and closes the connection. This error is logged:
Error: Mailbox folder: Corrupted transaction log file /var/spool/dovecot/user/mailboxes/folder/dbox-Mails/dovecot.index.log seq 2: indexid changed: 1734011270 -> 1734011403 (sync_offset=0)
Session 2: Check the folder again:
. status folder (messages uidvalidity)
- STATUS folder (MESSAGES 0 UIDVALIDITY 1734013512)
The mail is gone, uidvalidity was again increased by 1, so this is a new folder.
I think the problem is that the folder's transaction log is deleted in session 1 in mail_transaction_log_file_open() when Dovecot notices discrepancies in what it expects:
if (ret == 0) { /* corrupted */ if (index->readonly) { /* don't delete */ } else { i_unlink_if_exists(file->filepath); } *reason_r = "File is corrupted"; return 0; }
This basically recreates the folder, so now it's empty.
Here's the asterisk: I know that technically the mail isn't lost because it's still in the storage file and can be recovered. But it's still ugly. And when I copy a mail from another folder instead of appending it, I can't recover it for the folder because the information that the mail was copied is definitely lost.
Can this be fixed in Dovecot?