[Dovecot] SQLite dovecot query caching
Dominic Malolepszy
dmalolepszy at optusnet.com.au
Fri Jul 13 08:30:10 EEST 2012
On 24/06/12 04:57, Timo Sirainen wrote:
> On Sun, 2012-06-24 at 04:20 +1000, Dominic Malolepszy wrote:
>> On 24/06/12 3:39 AM, Timo Sirainen wrote:
>>> On Sun, 2012-06-24 at 03:36 +1000, Dominic Malolepszy wrote:
>>>> Hi,
>>>>
>>>> I am wondering if Dovecot caches SQLite queries, and how well it works
>>>> in high performance setups. I am particularly interested because in the
>>>> below thread SQLite has been suggested as a means of Dovecot proxying
>>>> connections to different ports.
>>> You can enable auth cache:
>>> http://wiki2.dovecot.org/Authentication/Caching
>>>
>>>
>>
>> This is a per user caching though, it will still have to perform a sql
>> look up each time a unique user authenticates to determine what port the
>> proxy should forward each connection. Is that accurate?
>
> It caches the passdb lookup. The cache key consists of the given %
> variables in the SQL query. So if your SQL query doesn't contain %n/%u
> then the cache doesn't add per-user entries.
>
>
Hi,
I had a chance to play around with this in the lab. The cache hit
appears to be returning values that should actually be ignored
particularly the username for the previous cached entry. This is causing
it to rewrite the username using what is in the cache. The passdb config
is as follows:
passdb {
driver = sql
args = /etc/dovecot-director/dovecot-sql.conf
}
The dovecot-sql.conf config contains:
driver = sqlite
connect = /tmp/dovecot-sqlite.db
password_query = select 'y' as proxy, \
NULL AS password, 'y' as nopassword, \
NULL AS user, NULL AS username, \
case '%a' \
when '110' then '9110' \
when '995' then '9995' \
when '143' then '9143' \
when '993' then '9993' end \
as port;
To demonstrate I log into POP3 first as user 'dmmailtest250' which
populates the cache with
(#011proxy#011port=9110#011user=dmmailtest250 at mailtest.com.au#011nopassword=y).
Than I log into POP3 as non existent user 'blahtest01229', which causes
the passdb to return user=dmmailtest250. Below is what is captured in
the logs:
Jul 13 14:16:59 mail01 dovecot: auth: Debug: client in:
AUTH#0111#011PLAIN#011service=pop3#011secured#011lip=127.0.0.1#011rip=127.0.0.1#011lport=110#011rport=52873#011resp=AGJsYWh0ZXN0MDEyMjkAcGFzc3dvcmQ=
Jul 13 14:16:59 mail01 dovecot: auth: Debug:
cache(blahtest01229 at mailtest.com.au,127.0.0.1): hit:
#011proxy#011port=9110#011user=dmmailtest250 at mailtest.com.au#011nopassword=y
Jul 13 14:16:59 mail01 dovecot: auth:
cache(blahtest01229 at mailtest.com.au,127.0.0.1): NULL password access
Jul 13 14:16:59 mail01 dovecot: auth: Debug:
auth(blahtest01229 at mailtest.com.au,127.0.0.1): username changed
blahtest01229 at mailtest.com.au -> dmmailtest250 at mailtest.com.au
Jul 13 14:16:59 mail01 dovecot: auth: Debug: client out:
OK#0111#011user=dmmailtest250 at mailtest.com.au#011proxy#011port=9110#011pass=password
Jul 13 14:16:59 mail01 dovecot: auth: Debug: client in:
AUTH#0111#011PLAIN#011service=pop3#011secured#011lip=192.168.1.151#011rip=192.168.1.151#011lport=9110#011rport=60096#011resp=AGRtb2llbWFpbHRlc3QyNTBAb3B0dXNuZXQuY29tLmF1AHBhc3N3b3Jk
Jul 13 14:16:59 mail01 dovecot: auth: Debug:
cache(dmmailtest250 at mailtest.com.au,192.168.1.151): hit:
{crypt}$1$eKFvOhwW$PYfPhY05SNUIRD439USMH/#011user=dmmailtest250 at mailtest.com.au#011userdb_home=/m5/dm/dmmailtest250#011userdb_quota_rule=*:backend=52428800S
I have not specified any sort of cache_key explicitly, because according
to http://wiki2.dovecot.org/Authentication/Caching "For SQL and LDAP
lookups Dovecot figures this out automatically by using all the used
%variables as the cache key", which means that %a is the key ie the
lport number which is 110 in this case. I tried specifying a NULL user
and username, but that does not help.
Cheers,
Dominic.
More information about the dovecot
mailing list