diff options
author | Eric Wong <e@80x24.org> | 2022-08-03 20:03:57 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2022-08-04 07:00:59 +0000 |
commit | e40b7230379f37b31563291bbbee2f0899874fed (patch) | |
tree | 51e5b7963f16374f953daf0ad537f4fc02e46239 /lib/PublicInbox/IMAP.pm | |
parent | f1e6dbd43146aec82aeb49cd249a8a86813506e1 (diff) | |
download | public-inbox-e40b7230379f37b31563291bbbee2f0899874fed.tar.gz |
ConfigIter was still too slow despite being fair. The addition of ART_MIN in ALL->misc means it can be used as a startup/reload cache for -imapd, too. This results in a ~3x faster startup for -imapd with 50K inboxes.
Diffstat (limited to 'lib/PublicInbox/IMAP.pm')
-rw-r--r-- | lib/PublicInbox/IMAP.pm | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/lib/PublicInbox/IMAP.pm b/lib/PublicInbox/IMAP.pm index 19ead70c..9955984b 100644 --- a/lib/PublicInbox/IMAP.pm +++ b/lib/PublicInbox/IMAP.pm @@ -350,12 +350,12 @@ sub idle_done ($$) { "$idle_tag OK Idle done\r\n"; } -sub ensure_slices_exist ($$$) { - my ($imapd, $ibx, $max) = @_; - defined(my $mb_top = $ibx->{newsgroup}) or return; +sub ensure_slices_exist ($$) { + my ($imapd, $ibx) = @_; + my $mb_top = $ibx->{newsgroup} // return; my $mailboxes = $imapd->{mailboxes}; my @created; - for (my $i = int($max/UID_SLICE); $i >= 0; --$i) { + for (my $i = int($ibx->art_max/UID_SLICE); $i >= 0; --$i) { my $sub_mailbox = "$mb_top.$i"; last if exists $mailboxes->{$sub_mailbox}; $mailboxes->{$sub_mailbox} = $ibx; @@ -387,7 +387,8 @@ sub inbox_lookup ($$;$) { my $uid_end = $uid_base + UID_SLICE; $exists = $over->imap_exists($uid_base, $uid_end); } - ensure_slices_exist($self->{imapd}, $ibx, $over->max); + delete $ibx->{-art_max}; + ensure_slices_exist($self->{imapd}, $ibx); } else { if ($examine) { $self->{uid_base} = $uid_base; @@ -396,9 +397,9 @@ sub inbox_lookup ($$;$) { } # if "INBOX.foo.bar" is selected and "INBOX.foo.bar.0", # check for new UID ranges (e.g. "INBOX.foo.bar.1") - if (my $z = $self->{imapd}->{mailboxes}->{"$mailbox.0"}) { - ensure_slices_exist($self->{imapd}, $z, - $z->over(1)->max); + if (my $ibx = $self->{imapd}->{mailboxes}->{"$mailbox.0"}) { + delete $ibx->{-art_max}; + ensure_slices_exist($self->{imapd}, $ibx); } } ($ibx, $exists, $uidmax + 1, $uid_base); |