Solr FTS - message deletes not working as expected
Shawn Heisey
elyograg at elyograg.org
Tue Oct 26 21:18:32 EEST 2021
I have Solr FTS enabled in dovecot. It is behaving differently than I
would expect.
When I delete messages in Thunderbird normally, using IMAP to talk to
dovecot, the deletion hits Solr right away. If I then ask Thunderbird
to empty the trash, that delete also hits Solr immediately.
But if I use shift-delete in Thunderbird, which deletes the message
immediately without going through Trash, things are different. One
delete that I did (6 messages) took at least a minute before Solr saw
the request. And on other tests that I ran, deleting one message, I
never did see the delete request hit Solr. I waited for several minutes.
I use the shift-delete mechanism a lot more than the method that sends
to trash. That way I do not need to remember to empty the trash.
Dovecot version is 2:2.3.16-2+ubuntu20.04 installed from the dovecot
repo, not from distro packages. I don't think the Solr version matters,
but just in case I am wrong, that is 8.10.1. I don't recall exactly
what I changed in the solrconfig.xml and managed-schema files, but it
should not be anything that affects how Solr FTS works. The problem
seems to be that Solr FTS isn't sending deletes, not that Solr is
behaving incorrectly.
I just discovered that trying to get the dovecot config failed:
root at bilbo:~# doveconf -n
# 2.3.16 (7e2e900c1a): /etc/dovecot/dovecot.conf
# Pigeonhole version 0.5.16 (09c29328)
doveconf: Fatal: Error in configuration file
/etc/dovecot/conf.d/10-master.conf line 64: Invalid size: $default_vsz_limit
After fixing that, this is what I get for the config:
root at bilbo:/etc/dovecot# doveconf -n
# 2.3.16 (7e2e900c1a): /etc/dovecot/dovecot.conf
# Pigeonhole version 0.5.16 (09c29328)
# OS: Linux 5.11.0-1020-aws x86_64 Ubuntu 20.04.3 LTS ext4
# Hostname: REDACTED
default_vsz_limit = 1 G
dict {
quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
}
first_valid_uid = 150
last_valid_uid = 150
listen = *
mail_gid = mail
mail_location = maildir:/var/vmail/%d/%u
mail_plugins = " quota fts fts_solr"
mail_privileged_group = mail
mail_uid = vmail
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 index ihave duplicate mime foreverypart extracttext
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 {
args = /etc/dovecot/dovecot-sql.conf.ext
driver = sql
}
plugin {
fts = solr
fts_autoindex = yes
fts_solr = url=http://localhost:8983/solr/dovecot/
quota = dict:User quota::proxy::quota
quota_grace = 10%%
quota_max_mail_size = 100M
quota_status_nouser = DUNNO
quota_status_overquota = 552 5.2.2 Mailbox is full
quota_status_success = DUNNO
sieve =
file:/var/vmail/sieve/%d/%u/sieve;active=/var/vmail/sieve/%d/%u/.dovecot.sieve
sieve_default = file:/var/vmail/global.sieve
}
postmaster_address = postmaster at REDACTED
protocols = " imap lmtp sieve pop3"
service auth {
unix_listener /var/spool/postfix/private/auth {
group = postfix
mode = 0666
user = postfix
}
unix_listener auth-userdb {
group = mail
mode = 0666
user = vmail
}
}
service dict {
unix_listener dict {
group = postfix
mode = 0660
user = vmail
}
}
service imap {
vsz_limit = 1 G
}
service stats {
unix_listener stats-reader {
group = vmail
mode = 0660
user = vmail
}
unix_listener stats-writer {
group = vmail
mode = 0660
user = vmail
}
}
ssl_cert = </etc/ssl/certs/local/mainwildcards.pem
ssl_client_ca_dir = /etc/ssl/certs
ssl_dh = # hidden, use -P to show it
ssl_key = # hidden, use -P to show it
userdb {
args = /etc/dovecot/dovecot-sql.conf.ext
driver = sql
}
protocol lmtp {
mail_plugins = " quota fts fts_solr sieve"
}
protocol lda {
mail_plugins = " quota fts fts_solr sieve"
}
protocol imap {
mail_max_userip_connections = 20
mail_plugins = " quota fts fts_solr imap_quota"
}
I repeated the delete test after fixing the config and there was no
change -- the delete request never made it to Solr.
Reindexing completely for my dovecot install takes about 8 minutes. I
have less than 150K messages. Reindexing for some could take hours or
days. This is what I use to initiate a full reindex:
root at bilbo:~# cat /usr/local/sbin/reindexsolr
#!/bin/sh
DOVECOT_SOLR_URL_BASE="http://localhost:8983/solr/dovecot"
DEL_ALL_QUERY_XML="<delete><query>*:*</query></delete>"
MAIL_ROOT=/var/vmail
service dovecot stop
curl \
"${DOVECOT_SOLR_URL_BASE}/update?commit=true&optimize=true" \
-H "Content-Type: text/xml" \
--data-binary "${DEL_ALL_QUERY_XML}"
find ${MAIL_ROOT} -name "dovecot.index*" -print0 | xargs -0 rm -f
service dovecot start
doveadm index -A -q '*'
More information about the dovecot
mailing list