[Dovecot] Handling ENFILE

Mike Abbott michael.abbott at apple.com
Mon Apr 13 22:29:22 EEST 2009


My mail server consumed all of its configured file table slots and  
started returning ENFILE ("Too many open files in system") for many  
operations.  This wreaked havoc with dovecot-1.1.13.  Here are some  
areas where dovecot should detect and more gracefully handle ENFILE  
error returns:

1.  Deliver should report an error more helpful than "Unknown internal  
error" when fdatasync_path fails:
deliver(user): Apr 10 14:53:20 Error: fdatasync_path(/Volumes/MailData/ 
user/new) failed: Too many open files in system
deliver(user): Apr 10 14:53:20 Info: msgid=<...>: save failed to  
INBOX: BUG: Unknown internal error

2.  Index files should not be fscked when they could not be opened due  
to ENFILE:
Error: IMAP(user): open() failed with index file /Volumes/MailData/ 
user/.Deleted Messages/dovecot.index: Too many open files in system
Warning: IMAP(user): fscking index file /Volumes/MailData/ 
user/.Deleted Messages/dovecot.index

3.  Dovecot should not crash when mail transaction logs become  
corrupt, or appear to have become corrupt due to ENFILE.  Here is a  
sequence of error messages from the log but I can't tell whether the  
IMAP ones up through the panic in the middle are all from the same  
process, or from different processes.
deliver(user): Apr 10 14:55:32 Info: msgid=<...>: saved mail to INBOX
deliver(user): Apr 10 14:55:54 Error: open() failed with index file / 
Volumes/MailData/user/dovecot.index: Too many open files in system
deliver(user): Apr 10 14:55:54 Error: open() failed with file /Volumes/ 
MailData/user/dovecot.index.log.2: Too many open files in system
deliver(user): Apr 10 14:55:57 Error: open() failed with index cache  
file /Volumes/MailData/user/dovecot.index.cache: Too many open files  
in system
dovecot: Apr 10 14:56:08 Warning: IMAP(user): fscking index file / 
Volumes/MailData/user/dovecot.index
dovecot: Apr 10 14:56:16 Error: IMAP(user): Fixed index file /Volumes/ 
MailData/user/dovecot.index: log_file_seq 15 -> 2
deliver(user): Apr 10 14:56:19 Info: msgid=<...>: saved mail to INBOX
deliver(user): Apr 10 14:56:20 Error: Corrupted transaction log file / 
Volumes/MailData/user/dovecot.index.log seq 2: record size too small  
(type=0x0, offset=23088, size=0) (sync_offset=36848)
deliver(user): Apr 10 14:56:20 Warning: fscking index file (in-memory  
index)
deliver(user): Apr 10 14:56:21 Info: msgid=<...>: save failed to  
INBOX: Internal error occurred. Refer to server log for more  
information. [2009-04-10 14:56:20]
dovecot: Apr 10 14:56:40 Panic: IMAP(user): file mail-transaction-log- 
view.c: line 103 (mail_transaction_log_view_set): assertion failed:  
(min_file_seq <= max_file_seq)
dovecot: Apr 10 14:56:40 Error: IMAP(user): Raw backtrace: [see below  
for better backtrace]
deliver(user): Apr 10 14:56:45 Error: Transaction log file /Volumes/ 
MailData/user/dovecot.index.log: marked corrupted
deliver(user): Apr 10 14:57:04 Info: msgid=<...>: saved mail to INBOX
deliver(user): Apr 10 14:57:23 Info: msgid=<...>: saved mail to INBOX
deliver(user): Apr 10 14:57:49 Info: msgid=<...>: saved mail to INBOX
deliver(user): Apr 10 14:58:21 Info: msgid=<...>: saved mail to INBOX
deliver(user): Apr 10 14:58:41 Info: msgid=<...>: saved mail to INBOX
deliver(user): Apr 10 14:59:09 Info: msgid=<...>: saved mail to INBOX
deliver(user): Apr 10 14:59:28 Info: msgid=<...>: saved mail to INBOX
deliver(user): Apr 10 14:59:43 Info: msgid=<...>: saved mail to INBOX
deliver(user): Apr 10 15:00:57 Info: msgid=<...>: saved mail to INBOX
deliver(user): Apr 10 15:03:01 Info: msgid=<...>: saved mail to INBOX
deliver(user): Apr 10 15:03:27 Info: msgid=<...>: saved mail to INBOX
dovecot: Apr 10 15:21:41 Error: IMAP(user): Corrupted transaction log  
file /Volumes/MailData/user/dovecot.index.log seq 2: Invalid  
transaction log size (36848 vs 23088): /Volumes/MailData/user/ 
dovecot.index.log (sync_offset=36848)
dovecot: Apr 10 15:21:42 Info: imap-login: Login: user=<user>,  
method=CRAM-MD5, rip=..., lip=..., TLS

The backtrace for the assertion failure was:
0   libSystem.B.dylib             	0x00007fff8007c102 __kill + 10
1   libSystem.B.dylib             	0x00007fff800f7ffc abort + 83
2   imap                          	0x000000010006a22e  
default_fatal_finish + 70
3   imap                          	0x000000010006a27c  
i_syslog_fatal_handler + 0
4   imap                          	0x00000001000699db i_info + 0
5   imap                          	0x0000000100058542  
mail_transaction_log_view_set + 104
6   imap                          	0x0000000100053b4c  
view_sync_set_log_view_range + 125
7   imap                          	0x0000000100053fc5  
mail_index_view_sync_begin + 378
8   imap                          	0x000000010003c26e  
index_mailbox_sync_init + 129
9   imap                          	0x0000000100018457  
maildir_storage_sync_init + 229
10  imap                          	0x000000010000c6bb imap_sync_init +  
132
11  imap                          	0x000000010000c90d cmd_sync_delayed  
+ 477
12  imap                          	0x000000010000716a  
client_handle_input + 409
13  imap                          	0x0000000100007244 client_input + 148
14  imap                          	0x0000000100071228  
io_loop_handler_run + 272
15  imap                          	0x00000001000705ed io_loop_run + 55
16  imap                          	0x000000010000e219 main + 1635
17  imap                          	0x00000001000016c0 start + 52

I have since configured more open files, and enabled core dumps and  
added the pid to the mail_log_prefix for better tracking, but this is  
all I have to work with for now.
Too bad the values of min_file_seq and max_file_seq are not logged in  
the panic.


More information about the dovecot mailing list