Quota count and clone questions

Bratislav ILIC Bratislav.ILIC at prointer.rs
Tue Sep 3 15:35:23 EEST 2019


Hi,

I presume you figured this out after all this time, but in any case.

Since quota_clone is not cumulative, it  always inserts new record with actual quota,
to be able to get correct results in postfixadmin one must:
 DROP TRIGGER mergequota2 ON quota2;

And to prevent ERROR:  duplicate key value violates unique constraint "quota2_pkey":
 CREATE FUNCTION public.clone_quota2() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
        BEGIN
            UPDATE quota2 SET bytes = NEW.bytes,
                messages = NEW.messages
                WHERE username = NEW.username;
            IF found THEN
                RETURN NULL;
            ELSE
                RETURN NEW;
            END IF;
      END;
      $$;

And then:
 CREATE TRIGGER clonequota2 BEFORE INSERT ON quota2 FOR EACH ROW EXECUTE PROCEDURE public.clone_quota2() ;

And finally just put:
 quota_clone_dict = proxy::sqlquota
 
Hope this helps somebody trying to figure out this too.

> I figured out that I can't just drop maintaining quota2 if I want 
> postfixadmin to report the quota status.
> 
> I also figured out a way to run a test on my config guesses.  I will try 
> to fit it in today, or tomorrow.  But any advise to the questions below 
> are welcomed!
> 
>>On 2/13/19 8:53 PM, Robert Moskowitz via dovecot wrote:
>> all this almost reads like I can drop maintaining the quota2 table?
>>
>> From https://wiki.dovecot.org/Quota/Count
>>
>> mailbox_list_index = yes
>> # Avoid spending excessive time waiting for the quota calculation to 
>> finish when
>> # mails' vsizes aren't already cached. If this many mails are opened, 
>> finish the
>> # quota calculation on background in indexer-worker process. Mail 
>> deliveries will
>> # be assumed to succeed, and explicit quota lookups will return 
>> internal error.
>> mail_vsize_bg_after_count = 100
>>
>> seems to belong in 10-mail.conf.  That is where those var are shown.
>>
>> But:
>>
>>
>> plugin {
>>   # 10MB quota limit
>>   quota = count:User quota
>>   quota_rule = *:storage=10M
>>
>>   # This is required - it uses "virtual sizes" rather than "physical 
>> sizes" for quota counting:
>>   quota_vsizes = yes
>> }
>>
>> I am having problems with.  Right now for quota I have:
>>
>> plugin {
>>         quota = dict:user::proxy::sqlquota
>>         trash = /etc/dovecot/dovecot-trash.conf.ext
>> }
>>
>> How do I reconcile these two?
>>
>> Then for clone:  https://wiki.dovecot.org/Plugins/QuotaClone
>>
>> how does:
>>
>> mail_plugins = $mail_plugins quota quota_clone
>> plugin {
>>   quota_clone_dict = redis:host=127.0.0.1:port=6379
>> }
>>
>> get replaced with something for mysql?
>>
>> dovecot-sql.conf.ext:
>>
>> driver = mysql
>> connect = host=/var/lib/mysql/mysql.sock dbname=postfix user=postfix 
>> password=$Postfix_Database_Password
>> default_pass_scheme = $cryptsha-CRYPT
>> # following should all be on one line.
>> password_query = SELECT username as user, password, 
>> concat('/home/vmail/', maildir) as userdb_home, 
>> concat('maildir:/home/vmail/', maildir) as userdb_mail, 101 as 
>> userdb_uid, 12 as userdb_gid FROM mailbox WHERE username = '%u' AND 
>> active = '1'
>> # following should all be on one line
>> user_query = SELECT concat('/home/vmail/', maildir) as home, 
>> concat('maildir:/home/vmail/', maildir) as mail, 101 AS uid, 12 AS 
>> gid, CONCAT('*:messages=30000:bytes=', quota) as quota_rule FROM 
>> mailbox WHERE username = '%u' AND active = '1'
>>
>> and
>>
>> dovecot-dict-sql.conf.ext:
>>
>> connect = host=/var/lib/mysql/mysql.sock dbname=postfix user=postfix 
>> password=$Postfix_Database_Password
>> map {
>>     pattern = priv/quota/storage
>>     table = quota2
>>     username_field = username
>>     value_field = bytes
>> }
>> map {
>>     pattern = priv/quota/messages
>>     table = quota2
>>     username_field = username
>>     value_field = messages
>> }
>>
>>
>>
>> thanks


More information about the dovecot mailing list