I meet the problem about dsync with expunge. The problems is expunged mail would reappear after dsyncing and it is easily to reproduce.
Environment Settings:
- Two servers(serverA, serverB) both enabled plugin "*replication"*
- And more detail get by "dovecot -n" show below
Reproduce flow: - Run two processes pA and pB both would run in while loop - pA(All behavior is on Draft mailbox and all on serverA):
- Clean "Draft" mailbox of userA
- Run the following imap command of userA
- imap save (save new mail to Draft)
- imap delete (delete old mail on Draft)
- imap expunge
- Check if draft only have one email (it would be failed in about 50 loops)* - pB(Send mail to serverB):
- Send new mail to userA (which would be save in INBOX)
It would be easier reproduce by increasing server loading.
I have found something - T he expunge changes from server A in dsync connection don't send immediately, these expunge changes appear after 1~2 dsync connection over.
- The replicated mail is generated from serverB and sync back to serverA so expunged mail reappeared. dovecot -n (ServerA)
2.2.19: /etc/dovecot/dovecot.conf
# OS: Linux 3.10.77 x86_64 ext4 auth_mechanisms = plain login default_internal_user = root default_login_user = dovecot default_vsz_limit = 0 disable_plaintext_auth = no doveadm_password = # hidden, use -P to show it dsync_remote_cmd = ssh -l%{login} %{host} doveadm dsync-server -u%u dsync_target_servers = tcps:10.13.23.139:24245 lda_mailbox_autocreate = yes mail_debug = yes mail_fsync = never mail_location = maildir:/var/spool/mail/%d/%-4.04i/%i/Maildir mail_max_userip_connections = 30 mail_never_cache_fields = * mail_plugins = " notify replication mail_log" 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 environment mailbox date ihave duplicate namespace inbox { inbox = yes location = mailbox Drafts { special_use = \Drafts } mailbox Junk { special_use = \Junk } mailbox Sent { special_use = \Sent } mailbox "Sent Messages" { special_use = \Sent } mailbox Trash { special_use = \Trash } prefix = } passdb { driver = pam } plugin { fts = lucene fts_autoindex = yes fts_lucene = whitespace_chars=@._/\~&,()[]" mail_log_events = delete undelete expunge copy mailbox_delete mailbox_rename flag_change append mail_log_fields = uid box msgid size flags from subject } postmaster_address = postmaster@localhost protocols = imap pop3 lmtp imap pop3 sieve replication_dsync_parameters = -N -l 30 -U service aggregator { fifo_listener replication-notify-fifo { group = users mode = 0666 user = admin } unix_listener replication-notify { group = users mode = 0666 user = admin } } service doveadm { inet_listener { address = 10.13.23.136,127.0.0.1 port = 24245 ssl = yes } } service imap-login { inet_listener imap { address = 10.13.23.136,127.0.0.1 port = 143 } inet_listener imaps { address = 10.13.23.136,127.0.0.1 port = 993 ssl = yes } process_limit = 256 service_count = 0 } service indexer-worker { process_limit = 8 } service pop3-login { inet_listener pop3 { address = 10.13.23.136,127.0.0.1 port = 110 } inet_listener pop3s { address = 10.13.23.136,127.0.0.1 port = 995 ssl = yes } process_limit = 256 service_count = 0 } service replicator { unix_listener replicator-doveadm { mode = 0666 } } userdb { driver = passwd } protocol lda { mail_plugins = " notify replication mail_log sieve" }
dovecot -n (ServerB) $ ./sbin/dovecot -n
# 2.2.19: /etc/dovecot/dovecot.conf # OS: Linux 3.10.77 x86_64 auth_mechanisms = plain login default_internal_user = root default_login_user = dovecot default_vsz_limit = 0 disable_plaintext_auth = no doveadm_password = # hidden, use -P to show it dsync_remote_cmd = ssh -l%{login} %{host} doveadm dsync-server -u%u dsync_target_servers = tcps:10.13.23.136:24245 lda_mailbox_autocreate = yes mail_debug = yes mail_fsync = always mail_location = maildir:/var/spool/mail/%d/%-4.04i/%i/Maildir mail_max_userip_connections = 30 mail_never_cache_fields = * mail_plugins = " notify replication mail_log" managesieve_notify_capability = mailto managesieve_sieve_capability = fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational reg ex imap4flags copy include variables body enotify environment mailbox date ihave duplicate namespace inbox { inbox = yes location = mailbox Drafts { special_use = \Drafts } mailbox Junk { special_use = \Junk } mailbox Sent { special_use = \Sent } mailbox "Sent Messages" { special_use = \Sent } mailbox Trash { special_use = \Trash } prefix = } passdb { driver = pam } plugin { fts = lucene fts_autoindex = yes fts_lucene = whitespace_chars=@._/\~&,()[]" mail_log_events = delete undelete expunge copy mailbox_delete mailbox_rename flag_change append mail_log_fields = uid box msgid size flags from subject } postmaster_address = postmaster@localhost protocols = imap pop3 lmtp imap pop3 sieve replication_dsync_parameters = -N -l 30 -U service aggregator { fifo_listener replication-notify-fifo { group = users mode = 0666 user = admin } unix_listener replication-notify { group = users mode = 0666 user = admin } } service doveadm { inet_listener { address = 10.13.23.139,127.0.0.1 port = 24245 ssl = yes } } service imap-login { inet_listener imap { address = 10.13.23.139,127.0.0.1 port = 143 } inet_listener imaps { address = 10.13.23.139,127.0.0.1 port = 993 ssl = yes } process_limit = 256 service_count = 0 } service indexer-worker { process_limit = 4 } service pop3-login { inet_listener pop3 { address = 10.13.23.139,127.0.0.1 port = 110 } inet_listener pop3s { address = 10.13.23.139,127.0.0.1 port = 995 ssl = yes } process_limit = 256 service_count = 0 } service replicator { unix_listener replicator-doveadm { mode = 0666 } } userdb { driver = passwd } protocol lda { mail_plugins = " notify replication mail_log sieve" }
Regards, Jay Pan