From c3bf5d306ff1396d6117774316afd998f6e9874a Mon Sep 17 00:00:00 2001 From: Guilhem Moulin Date: Mon, 11 Nov 2019 16:43:40 +0100 Subject: interimap: raise SELECT sample set size from 64 to 256 bytes. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A n-bytes set covers at least ⌊(n+1)/11⌋ UIDs (UIDs are at most 10 bytes of size), hence 23 UIDs for 256 bytes long sets. However we exceed it by another range, so in the worst case (if the the higher UIDs are sparse) we'll sample ⌊(n+1)/11+1⌋ UIDs: 1000000000,1000000002,1000000004,…,1000000046 This was 6 UIDs for n=64 which is a tad low; this is now raised to 24 UIDs. The actual set size returned by sample() is of max size n+22 bytes (extra "$UID1:$UID2," where $UID1 and $UID2 are both ≥10⁹). --- interimap | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'interimap') diff --git a/interimap b/interimap index a409c65..9a1df0b 100755 --- a/interimap +++ b/interimap @@ -793,7 +793,7 @@ sub delete_mapping($$) { # we let the server know that the messages have been EXPUNGEd [RFC7162, # section 3.2.5.2]. # The UID set is the largest set of higest UIDs with at most 1024 UIDs, -# of length (once compacted) at most 64. +# of length (once compacted) at most 256. # The reason why we sample with the highest UIDs is that lowest UIDs are # less likely to be deleted. sub sample($$) { @@ -814,13 +814,14 @@ sub sample($$) { $uids = ($min == $max ? $min : "$min:$max") .(defined $uids ? ','.$uids : ''); $min = $max = $k; - if (length($uids) > 64) { + if (length($uids) > 256) { $sth->finish(); # done with the statement last; } } } - if (!defined $uids or length($uids) <= 64) { + if (!defined $uids or length($uids) <= 256) { + # exceed max size by at most 22 bytes ("$MIN:$MAX,") $n += $max - $min + 1; $uids = ($min == $max ? $min : "$min:$max") . (defined $uids ? ','.$uids : ''); -- cgit v1.2.3