[Dovecot] Maildir filename has wrong S value
Michael Gmelin
freebsd at grem.de
Sat Jun 9 03:58:15 EEST 2012
On 15.5.12 12:23, Wouter de Geus wrote:
> Hello folks,
>
> This morning I tried to open an old archive mail folder using Mutt.
> However, while fetching headers it aborted.
> Checking the dovecot log gave me this:
>
> @400000004fb21996267d37d4 imap(benv): Error: Cached message size smaller than expected (9115 < 9420)
> @400000004fb21996267e8bac imap(benv): Error: Maildir filename has wrong S value, renamed the file from /home/vpopmail/domains/benv.junerules.com/benv/Maildir/.Old.2009/cur/1260395566.28175.black,S=9115:2,S to /home/vpopmail/domains/benv.junerules.com/benv/Maildir/.Old.2009/cur/1260395566.28175.black,S=9420:2,S
> @400000004fb21996267e937c imap(benv): Error: Corrupted index cache file /home/vpopmail/domains/benv.junerules.com/benv/Maildir/.Old.2009/dovecot.index.cache: Broken physical size for mail UID 294
> @400000004fb21996267eaaec imap(benv): Error: read(/home/vpopmail/domains/benv.junerules.com/benv/Maildir/.Old.2009/cur/1260395566.28175.black,S=9115:2,S) failed: Input/output error (uid=294)
> @400000004fb219962680683c imap(benv): Info: Disconnected: Internal error occurred. Refer to server log for more information. [2012-05-15 10:53:32] in=6503 out=192718
>
> I've retried opening this folder several times, but each time Dovecot only fixes 1 file and then aborts.
> (the folder apparently has a lot more files with incorrect sizes).
> My question here is: Why does dovecot abort? Isn't the issue fixed after the rename?
>
> Also: The files are not corrupted or unreadable, reading them through the commandline works fine.
> I've looked through my backups and saw that at least half a year ago this mismatch in size was already present.
>
> I've been running dovecot for quite a while, so the cause of this size mismatch might very well be a issue in an older version of dovecot / my configuration.
> Right now I'm running dovecot 2.1.6, but I've been running the v1.2 version for quite a while before that.
>
> Is this something that can be improved in dovecot so it doesn't abort after 1 rename?
> (of course I could script a rename operation, but that seems like a workaround to me)
>
> Thanks for reading.
>
> Wouter.
>
>
>
>
> My current configuration:
> =========================
> # 2.1.6: /etc/dovecot/dovecot.conf
> # OS: Linux 2.6.32.32-g3d14ce7 x86_64 Slackware 11.0.0
> base_dir = /var/run/dovecot2/
> disable_plaintext_auth = no
> first_valid_uid = 89
> info_log_path = /dev/stderr
> last_valid_uid = 89
> log_path = /dev/stderr
> log_timestamp =
> mail_debug = yes
> mail_location = maildir:~/Maildir
> mail_max_userip_connections = 50
> managesieve_notify_capability = mailto
> managesieve_sieve_capability = fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables body enotify e
> nvironment mailbox date
> namespace {
> inbox = yes
> location =
> prefix = INBOX.
> separator = .
> type = private
> }
> passdb {
> driver = vpopmail
> }
> plugin {
> autocreate = INBOX.Spam
> quota = maildir
> sieve = ~/.sieve/dovecot.sieve
> sieve_dir = ~/.sieve
> sieve_global_dir = /etc/dovecot/sieve/
> sieve_subaddress_sep = -+
> }
> protocols = imap pop3 sieve
> service auth {
> unix_listener auth-master {
> group = vchkpw
> mode = 0660
> }
> unix_listener auth-userdb {
> group = vchkpw
> mode = 0660
> }
> }
> service imap-login {
> inet_listener imap {
> address = [::] *
> port = 143
> }
> inet_listener imaps {
> address = [::] *
> port = 993
> }
> process_limit = 256
> process_min_avail = 3
> service_count = 1
> user = dovecot
> }
> service managesieve-login {
> process_limit = 256
> process_min_avail = 3
> service_count = 1
> user = dovecot
> }
> service pop3-login {
> inet_listener pop3 {
> address = [::] *
> port = 110
> }
> inet_listener pop3s {
> address = [::] *
> port = 995
> }
> process_limit = 256
> process_min_avail = 3
> service_count = 1
> user = dovecot
> }
> ssl_cert = </var/qmail/control/servercert.pem
> ssl_cipher_list = ALL:!LOW
> ssl_key = </var/qmail/control/servercert.pem
> userdb {
> driver = vpopmail
> }
> verbose_proctitle = yes
> protocol lda {
> hostname = mail.benv.junerules.com
> info_log_path = /var/log/dovecot/dovecot2-deliver.log
> log_path = /var/log/dovecot/dovecot2-deliver-errors.log
> mail_plugins = sieve
> postmaster_address = postmaster at benv.junerules.com
> sendmail_path = /var/qmail/bin/sendmail
> }
> protocol imap {
> imap_max_line_length = 64 k
> mail_plugins = quota imap_quota autocreate
> }
> protocol pop3 {
> mail_plugins = quota autocreate
> pop3_no_flag_updates = no
> pop3_uidl_format = %v-%u
> }
> =================================
>
I've been facing the same issue today in a similar setup (qmail +
vpopmail + dovecot) and figured, that the qmail maildir++ patch I'm
using miscalculates the size of mail, since it ignores Delivered-To and
Return-Path in the size calculation. Fixing this and reinstalling
qmail-local ( plus fixing existing mail using doveadm fetch -u username
text all > /dev/null ) solved the problem for me.
The problematic line in qmail-local.c is:
s += fmt_ulong(s,st.st_size); *s++ = 0;
which should be:
s += fmt_ulong(s,st.st_size+rpline.len+dtline.len); *s++ = 0;
(for FreeBSD users: I submitted a patch to the qmail port, fixing this)
http://www.freebsd.org/cgi/query-pr.cgi?pr=ports/168870
Fixing this also fixed fts_squat for me (dovecot 2.1.7)
--
Michael
More information about the dovecot
mailing list