On 20/09/2021 18:04, Gedalya wrote:
I don't know how I can tell which mailbox is selected / being appended to.
Mailbox format is Maildir. Filesystem is XFS.
System was upgraded from 2.2.36.1 to 2.3.16, and it seems this started happening following that.
Sep 20 15:49:34 imap1 dovecot: imap(u@d)<17673><jfjuOW/Mf+xEgdSK>: Panic: file mail-index-map.c: line 558 (mail_index_map_lookup_seq_range): assertion failed: (first_uid > 0) Sep 20 15:49:34 imap1 dovecot: imap(u@d)<17673><jfjuOW/Mf+xEgdSK>: Error: Raw backtrace: /usr/lib/dovecot/libdovecot.so.0(backtrace_append+0x42) [0x7f363c72dc22] -> /usr/lib/dovecot/libdovecot.so.0(backtrace_get+0x1e) [0x7f363c72dd3e] -> /usr/lib/dovecot/libdovecot.so.0(+0xff47b) [0x7f363c73c47b] -> /usr/lib/dovecot/libdovecot.so.0(+0xff511) [0x7f363c73c511] -> /usr/lib/dovecot/libdovecot.so.0(+0x5427c) [0x7f363c69127c] -> /usr/lib/dovecot/libdovecot-storage.so.0(+0x49e07) [0x7f363c84fe07] -> /usr/lib/dovecot/libdovecot-storage.so.0(+0xf0499) [0x7f363c8f6499] -> /usr/lib/dovecot/libdovecot-storage.so.0(mail_index_lookup_seq+0xf) [0x7f363c8ff20f] -> /usr/lib/dovecot/libdovecot-storage.so.0(index_mail_set_uid+0x2f) [0x7f363c8cf79f] -> /usr/lib/dovecot/libdovecot-storage.so.0(mail_set_uid+0x35) [0x7f363c8559a5] -> /usr/lib/dovecot/modules/lib95_imap_sieve_plugin.so(+0x8d02) [0x7f363c255d02] -> /usr/lib/dovecot/modules/lib10_quota_plugin.so(+0x130f4) [0x7f363c45e0f4] -> /usr/lib/dovecot/libdovecot-storage.so.0(mailbox_transaction_commit_get_changes+0x56) [0x7f363c8628a6] -> dovecot/imap [u@d xx.xx.xx.xx APPEND](+0x13e10) [0x55eae70f8e10] -> dovecot/imap [u@d xx.xx.xx.xx APPEND](command_exec+0xa4) [0x55eae7104844] -> dovecot/imap [u@d xx.xx.xx.xx APPEND](+0x1333b) [0x55eae70f833b] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_call_io+0x69) [0x7f363c752869] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_handler_run_internal+0x132) [0x7f363c7546d2] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_handler_run+0x50) [0x7f363c754780] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_run+0x40) [0x7f363c754940] -> /usr/lib/dovecot/libdovecot.so.0(master_service_run+0x13) [0x7f363c6c4dd3] -> dovecot/imap [u@d xx.xx.xx.xx APPEND](main+0x500) [0x55eae70f7120] -> /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xea) [0x7f363c49ad0a] -> dovecot/imap [u@d xx.xx.xx.xx APPEND](_start+0x2a) [0x55eae70f721a] Sep 20 15:49:34 imap1 dovecot: imap(u@d)<17673><jfjuOW/Mf+xEgdSK>: Fatal: master: service(imap): child 17673 killed with signal 6 (core dumped)
I am not sure how this starts happening now. I don't see changes in the imapsieve code that could cause this. But the existing code does have a path towards this problem. If you have the opportunity to apply and test patches, this should fix it: diff --git a/src/plugins/imapsieve/imap-sieve-storage.c b/src/plugins/imapsieve/imap-sieve-storage.c index 53761c64e..1c9131af5 100644 --- a/src/plugins/imapsieve/imap-sieve-storage.c +++ b/src/plugins/imapsieve/imap-sieve-storage.c @@ -581,6 +581,7 @@ imap_sieve_mailbox_run_copy_source( return; i_assert(ismt->src_mail_trans->box == src_box); + i_assert(mevent->src_mail_uid > 0); if (*src_mail == NULL) *src_mail = mail_alloc(ismt->src_mail_trans, 0, NULL); @@ -741,11 +742,18 @@ imap_sieve_mailbox_transaction_run( bool fatal; /* Determine UID for saved message */ - if (mevent->dest_mail_uid > 0 || - !seq_range_array_iter_nth(&siter, mevent->save_seq, &uid)) + if (mevent->dest_mail_uid > 0 uid = mevent->dest_mail_uid; + else if (!seq_range_array_iter_nth(&siter, mevent->save_seq, + &uid)) { + /* already gone for some reason */ + imap_sieve_mailbox_debug( + sbox, "Message for Sieve event gone"); + continue; + } /* Select event message */ + i_assert(uid > 0); if (!mail_set_uid(mail, uid) || mail->expunged) { /* already gone for some reason */ imap_sieve_mailbox_debug(sbox,
# doveconf -n # 2.3.16 (): /etc/dovecot/dovecot.conf # Pigeonhole version 0.5.16 (09c29328) # OS: Linux 5.10.0-8-amd64 x86_64 Debian 11.0 # Hostname: imap1.xxxxx.com auth_default_realm = xxxxx.com auth_master_user_separator = * auth_mechanisms = plain login cram-md5 auth_proxy_self = xxxxxxxxxx auth_verbose = yes auth_verbose_passwords = plain dict { lastlogin = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext } disable_plaintext_auth = no doveadm_password = # hidden, use -P to show it imap_hibernate_timeout = 10 secs lmtp_rcpt_check_quota = yes log_timestamp = "%Y-%m-%d %H:%M:%S " login_greeting = Dovecot ready login_log_format_elements = user=<%u> method=%m rip=%r lip=%l pip=%{real_rip} mpid=%e %c %k session=<%{session}> login_trusted_networks = xxxxxxxxxxxxxxxxx mail_attachment_detection_options = add-flags-on-save mail_gid = vmail mail_location = /nowhere mail_plugins = quota listescape mail_privileged_group = mail mail_uid = vmail managesieve_sieve_capability = fileinto envelope encoded-character subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables mailbox date index ihave duplicate mime foreverypart extracttext namespace inbox { inbox = yes location = mailbox Drafts { auto = subscribe special_use = \Drafts } mailbox Junk { auto = subscribe autoexpunge = 30 days special_use = \Junk } mailbox Sent { auto = subscribe special_use = \Sent } mailbox "Sent Messages" { special_use = \Sent } mailbox Trash { auto = subscribe autoexpunge = 30 days special_use = \Trash } mailbox Trash/* { autoexpunge = 30 days } prefix = separator = / type = private } passdb { args = /etc/dovecot/master-users driver = passwd-file master = yes pass = yes } passdb { args = /etc/dovecot/dovecot-sql.conf.ext driver = sql } plugin { imapsieve_mailbox1_before = file:/usr/local/lib/imapsieve/report-spam.sieve imapsieve_mailbox1_causes = COPY APPEND imapsieve_mailbox1_name = Junk imapsieve_mailbox2_before = file:/usr/local/lib/imapsieve/report-ham.sieve imapsieve_mailbox2_causes = COPY imapsieve_mailbox2_from = Junk imapsieve_mailbox2_name = * imapsieve_mailbox3_before = file:/usr/local/lib/imapsieve/report-ham.sieve imapsieve_mailbox3_causes = APPEND imapsieve_mailbox3_name = INBOX last_login_dict = proxy::lastlogin last_login_key = # hidden, use -P to show it quota = dict:user::proxy::quota quota_rule = *:storage=2G quota_rule2 = Trash:storage=+250M quota_rule3 = Junk:ignore quota_vsizes = yes quota_warning = storage=95%% quota-warning 95 %u quota_warning2 = storage=85%% quota-warning 85 %u sieve = file:~/sieve;active=~/.dovecot.sieve sieve_before = /etc/dovecot/sieve-global/fileinto-spam.sieve sieve_extensions = -vacation -body -reject -enotify -environment -virustest -spamtest sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.environment sieve_max_actions = 32 sieve_max_redirects = 4 sieve_max_script_size = 10K sieve_pipe_bin_dir = /usr/local/lib/imapsieve sieve_plugins = sieve_imapsieve sieve_extprograms sieve_quota_max_scripts = 100 sieve_quota_max_storage = 4M } pop3_fast_size_lookups = yes pop3_no_flag_updates = yes postmaster_address = postmaster@xxxxx.com protocols = imap pop3 lmtp sieve quota_full_tempfail = yes service auth-worker { user = $default_internal_user } service auth { client_limit = 2448 unix_listener auth-userdb { group = root mode = 0600 user = vmail } } service dict { unix_listener dict { group = root mode = 0600 user = vmail } } service imap-hibernate { unix_listener imap-hibernate { group = $default_internal_group mode = 0660 } } service imap-login { process_min_avail = 4 service_count = 0 vsz_limit = 192 M } service imap { process_limit = 1024 unix_listener imap-master { user = $default_internal_user } vsz_limit = 384 M } service lmtp { inet_listener lmtp { port = 7025 } } service managesieve-login { inet_listener sieve { port = 4190 } service_count = 0 vsz_limit = 64 M } service managesieve { process_limit = 20 } service pop3-login { process_min_avail = 4 service_count = 0 vsz_limit = 192 M } service pop3 { process_limit = 1024 } service quota-warning { executable = script /usr/local/bin/quota-warning unix_listener quota-warning { user = vmail } user = dovecot } ssl_cert = </var/local/letsencrypt/live/xxxxxxxxxxx/fullchain.pem ssl_client_ca_dir = /etc/ssl/certs ssl_dh = # hidden, use -P to show it ssl_key = # hidden, use -P to show it ssl_min_protocol = TLSv1 userdb { driver = prefetch } userdb { args = /etc/dovecot/dovecot-sql.conf.ext driver = sql } verbose_proctitle = yes protocol lmtp { mail_plugins = quota listescape sieve } protocol lda { mail_plugins = quota listescape sieve } protocol imap { mail_max_userip_connections = 20 mail_plugins = quota listescape imap_quota imap_sieve last_login } protocol sieve { mail_max_userip_connections = 5 } protocol pop3 { mail_max_userip_connections = 10 mail_plugins = quota listescape last_login }