[Dovecot] IMAP-proxy or not with sogo webmail and dovecot backend

Michael M Slusarz slusarz at curecanti.org
Tue Feb 14 05:30:09 EET 2012


Quoting Timo Sirainen <tss at iki.fi>:

> On 13.2.2012, at 23.32, Timo Sirainen wrote:
>
>> Perhaps a way for (trusted) clients to be able to do this? :)
>>
>> a logout save
>> * OK [SAVEDSTATE 1234567890]
>> * BYE logged out
>> a OK
>
> Actually, this could probably be safely implemented by sending all  
> of the state to the client as a string:
>
> * OK [SAVEDSTATE base64-encoded-state]
>
> There isn't a whole lot of state to be saved really. Mailbox GUID,  
> UIDVALIDITY, HIGHESTMODSEQ gives the mailbox state. Then you have  
> the language/etc. states. Clients could restore their earlier state  
> from days ago, as long as Dovecot still has the necessary .log  
> records available (similar to how QRESYNC works).

Given that it is not *that* expensive to re-create the state, I don't  
think the ability to recreate state from several days ago would be  
worth the effort of storing in the log/index files.  For a  
disconnected client (e.g. webmail), there's going to necessarily need  
to be startup costs of initializing the session anyway so re-creating  
the state can be buried in this other work.

Re-creating becomes more important when users are doing actions they  
expect immediate (or at least very fast) responses for.  Things like  
listing messages in a mailbox, viewing a message, or polling  
mailboxes.  Saving 50ms per request becomes important in these  
situations since re-creating state now takes 10% of the total request  
time.

So I don't think states don't need a terribly long lifetime.  I almost  
think of something like an internal Dovecot IDLE queue - after a  
logout is received, state is stored for 30 minutes after which it is  
discarded.  (Although not knowing anything about internal Dovecot  
state, don't know if this is overly resource intensive.)

As for base-64-encoded state: if other IMAP servers ever wanted to  
implement a similar protocol trying to coordinate the data structure  
would be a nightmare.  Keeping it to something like a MODSEQ value  
would hide the state ID -> data abstraction entirely within dovecot.   
And would allow you to change your mind in the future if
you come up with a better way to represent state.

michael




More information about the dovecot mailing list