From cfae078171fc1453be0795e4ba5f0252627ebba3 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 10 Jun 2020 07:04:40 +0000 Subject: imap: require ".$UID_MIN-$UID_END" suffix Finish up the IMAP-only portion of iterative config reloading, which allows us to create all sub-ranges of an inbox up front. The InboxIdler still uses ->each_inbox which will struggle with 100K inboxes. Having messages in the top-level newsgroup name of an inbox will still waste bandwidth for clients which want to do full syncs once there's a rollover to a new 50K range. So instead, make every inbox accessible exclusively via 50K slices in the form of "$NEWSGROUP.$UID_MIN-$UID_END". This introduces the DummyInbox, which makes $NEWSGROUP and every parent component a selectable, empty inbox. This aids navigation with mutt and possibly other MUAs. Finally, the xt/perf-imap-list maintainer test is broken, now, so remove it. The grep perlfunc is already proven effective, and we'll have separate tests for mocking out ~100k inboxes. --- xt/imapd-mbsync-oimap.t | 5 +++-- xt/imapd-validate.t | 9 +++++---- xt/perf-imap-list.t | 38 -------------------------------------- 3 files changed, 8 insertions(+), 44 deletions(-) delete mode 100644 xt/perf-imap-list.t (limited to 'xt') diff --git a/xt/imapd-mbsync-oimap.t b/xt/imapd-mbsync-oimap.t index d2237a24..b2cb8737 100644 --- a/xt/imapd-mbsync-oimap.t +++ b/xt/imapd-mbsync-oimap.t @@ -13,12 +13,13 @@ my $inboxdir = $ENV{GIANT_INBOX_DIR}; plan skip_all => "bad characters in $inboxdir" if $inboxdir =~ m![^\w\.\-/]!; my ($tmpdir, $for_destroy) = tmpdir(); my $cfg = "$tmpdir/cfg"; -my $mailbox = 'inbox.test'; +my $newsgroup = 'inbox.test'; +my $mailbox = "$newsgroup.1-50000"; { open my $fh, '>', $cfg or BAIL_OUT "open: $!"; print $fh <(); + $mailbox = "$newsgroup.1-50000"; } my %opts = (imap => \%OPT, 'imap+compress' => { %OPT, Compress => 1 }); @@ -124,15 +125,15 @@ BEGIN { $make_local_server = sub { require PublicInbox::Inbox; - $mailbox = 'inbox.test'; - my $ibx = { inboxdir => $inbox_dir, newsgroup => $mailbox }; + $newsgroup = 'inbox.test'; + my $ibx = { inboxdir => $inbox_dir, newsgroup => $newsgroup }; $ibx = PublicInbox::Inbox->new($ibx); my $pi_config = "$tmpdir/config"; { open my $fh, '>', $pi_config or die "open($pi_config): $!"; print $fh <<"" or die "print $pi_config: $!"; [publicinbox "test"] - newsgroup = $mailbox + newsgroup = $newsgroup inboxdir = $inbox_dir address = test\@example.com diff --git a/xt/perf-imap-list.t b/xt/perf-imap-list.t deleted file mode 100644 index 0f00f487..00000000 --- a/xt/perf-imap-list.t +++ /dev/null @@ -1,38 +0,0 @@ -#!perl -w -# Copyright (C) 2020 all contributors -# License: AGPL-3.0+ -use Test::More; -use_ok 'PublicInbox::IMAP'; -use_ok 'PublicInbox::IMAPD'; -use PublicInbox::DS; -use Benchmark qw(:all); -my @n = map { { newsgroup => "inbox.comp.foo.bar.$_" } } (0..50000); -push @n, map { { newsgroup => "xobni.womp.foo.bar.$_" } } (0..50000); -my $self = { imapd => { grouplist => \@n } }; -my $n = scalar @n; -my $t = timeit(1, sub { - PublicInbox::IMAPD::refresh_inboxlist($self->{imapd}); -}); -diag timestr($t). "refresh $n inboxes"; - -open my $null, '>', '/dev/null' or BAIL_OUT "open: $!"; -my $ds = { sock => $null }; -my $nr = 200; -diag "starting benchmark..."; -my $cmd_list = \&PublicInbox::IMAP::cmd_list; -$t = timeit(1, sub { - for (0..$nr) { - my $res = $cmd_list->($self, 'tag', '', '*'); - PublicInbox::DS::write($ds, $res); - } -}); -diag timestr($t). "list all for $n inboxes $nr times"; -$nr = 20; -$t = timeit(1, sub { - for (0..$nr) { - my $res = $cmd_list->($self, 'tag', 'inbox.', '%'); - PublicInbox::DS::write($ds, $res); - } -}); -diag timestr($t). "list partial for $n inboxes $nr times"; -done_testing; -- cgit v1.2.3-24-ge0c7