[Dovecot] Issues with VANISHED CHANGEDSINCE

Michael J Rubinsky mrubinsk at horde.org
Tue Nov 6 16:24:07 EET 2012


Quoting Timo Sirainen <tss at iki.fi>:

> On 6.11.2012, at 3.49, Michael J Rubinsky wrote:
>
>>> That would require infinitely storing the modseq of when each message
>>> was expunged. Not very nice. Also the RFC talks a lot about this
>>> situation. The SELECT command has two optional parameters to optimize
>>> it.
>>
>> The RFC *does* indicate that a server implementation could,  
>> strictly speaking, be considered in compliance without remembering  
>> modsequences for all expunged messages, but it does explicitly  
>> discourage such implementations. From RFC 5162 [4.1]:
>>
>>   Strictly speaking, a server implementation that doesn't remember mod-
>>   sequences associated with expunged messages can be considered
>>   compliant with this specification.  Such implementations return all
>>   expunged messages specified in the UID set of the UID FETCH
>>   (VANISHED) command every time, without paying attention to the
>>   specified CHANGEDSINCE mod-sequence.  Such implementations are
>>   discouraged, as they can end up returning VANISHED responses that are
>>   bigger than the result of a UID SEARCH command for the same UID set.
>
> This is talking about a server that doesn't permanently remember ANY  
> modseqs for expunges. Dovecot remembers them, not not infinitely.
>
>> It also gives advice to avoid infinitely storing the modsequences  
>> such as "expiring" sequences associated with older expunged  
>> messages, but assigning a single modsequence value to all of the  
>> expired expunged messages.
>
> Dovecot behaves as the section 4.3 describes. Note especially:
>
>    Note that indefinitely storing information about expunged messages
>    can cause storage and related problems for an implementation.
> ..
>    Hence, implementations are encouraged to adopt strategies to protect
>    against such storage problems, such as limiting the size of the queue
>    used to store mod-sequences for expunged messages and "expiring"
>    older records when this limit is reached.  When the selected
>    implementation-specific queue limit is reached, the oldest record(s)
>    are deleted from the queue (note that such records are located at the
>    queue head).  For all such "expired" records, the server needs to
>    store a single mod-sequence, which is the highest mod-sequence for
>    all "expired" expunged messages.
>
> This is exactly what Dovecot does. There is a single modseq  
> associated with all the previously expunged messages. If you try to  
> request expunges for that modseq, it returns all of the expunged  
> messages, which is what you're seeing as a problem.
>
> It might be helpful in some situations to decrease the precision and  
> remember for example:
>  * UIDs 1-100 were deleted with modseq 10 (in reality multiple times  
> between modseqs 1..10)
>  * UIDs 101-130 were deleted with modseq 15 (in reality with modseqs 11..15)
> .. and so on
>
> But this assumes that the expunged UID ranges compress well. If UIDs  
> are being deleted here and there it's still pretty wasteful to store  
> them.
>
> And yes, the current way may be forgetting them a bit too early when  
> a lot of other unrelated changes are happening. It would be possible  
> to keep a separate expunge log which could remember the expunges  
> longer. But that would be yet another different index file for  
> Dovecot, which annoyingly complicates everything. And currently  
> since it sounds like the only problem is activesync implementation  
> using it, I'm not very interested in spending a lot of time on it.

> These defines in mail-transaction-log-private.h anyway can be  
> changed to make it much less likely to see your problem:
>
> /* Rotate when log is older than ROTATE_TIME and larger than MIN_SIZE */
> #define MAIL_TRANSACTION_LOG_ROTATE_MIN_SIZE (1024*32)
> /* If log is larger than MAX_SIZE, rotate regardless of the time */
> #define MAIL_TRANSACTION_LOG_ROTATE_MAX_SIZE (1024*1024)
> #define MAIL_TRANSACTION_LOG_ROTATE_TIME (60*5)
>
> /* Delete .log.2 files older than this many seconds. Don't be too eager,
>    older files are useful for QRESYNC and dsync. */
> #define MAIL_TRANSACTION_LOG2_STALE_SECS (60*60*24*2)
>
> Maybe the defaults could be changed..

Thanks for the information and clarification, Timo.


-- 
mike

The Horde Project (www.horde.org)
mrubinsk at horde.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 6062 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://dovecot.org/pipermail/dovecot/attachments/20121106/792f95ca/attachment-0004.bin>


More information about the dovecot mailing list