about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2022-07-23 06:12:16 +0000
committerEric Wong <e@80x24.org>2022-07-23 14:22:35 +0000
commit0ae89efce11e1e3b10a067c61c5b4cde30fa2b3b (patch)
treee87437279d3c45a8698d97e9e8451d0d28859e45
parent23af251dd607c4e75ab1e68063f2c885c48cc035 (diff)
downloadpublic-inbox-0ae89efce11e1e3b10a067c61c5b4cde30fa2b3b.tar.gz
While the cache itself is relatively compact for 50K messages,
generating it was inefficient due to our schema and Over.pm APIs
being designed for NNTP.  While we won't change our schema for
now, we can choose better DBI APIs to use and limit our ephemeral
memory use.

This amounts to a 60% reduction in memory usage and a 5-10%
speedup against org.kernel.vger.git.0:

	{
		echo 'USER '$(uuidgen)'@org.kernel.vger.git.0'
		echo PASS anonymous
		echo STAT
		echo QUIT
	} | nc $HOST $PORT
-rw-r--r--lib/PublicInbox/POP3.pm15
1 files changed, 12 insertions, 3 deletions
diff --git a/lib/PublicInbox/POP3.pm b/lib/PublicInbox/POP3.pm
index 60eedea7..203c91a6 100644
--- a/lib/PublicInbox/POP3.pm
+++ b/lib/PublicInbox/POP3.pm
@@ -148,12 +148,21 @@ sub _stat_cache ($) {
         my ($self) = @_;
         my ($beg, $end) = (($self->{uid_dele} // -1) + 1, $self->{uid_max});
         PublicInbox::IMAP::uid_clamp($self, \$beg, \$end);
-        my $opt = { limit => PublicInbox::IMAP::UID_SLICE };
-        my $m = $self->{ibx}->over(1)->do_get(<<'', $opt, $beg, $end);
+        my (@cache, $m);
+        my $sth = $self->{ibx}->over(1)->dbh->prepare_cached(<<'', undef, 1);
 SELECT num,ddd FROM over WHERE num >= ? AND num <= ?
 ORDER BY num ASC
 
-        [ map { ($_->{num}, $_->{bytes} + 0, $_->{blob}) } @$m ];
+        $sth->execute($beg, $end);
+        do {
+                $m = $sth->fetchall_arrayref({}, 1000);
+                for my $x (@$m) {
+                        PublicInbox::Over::load_from_row($x);
+                        push(@cache, $x->{num}, $x->{bytes} + 0, $x->{blob});
+                        undef $x; # saves ~1.5M memory w/ 50k messages
+                }
+        } while (scalar(@$m) && ($beg = $cache[-3] + 1));
+        \@cache;
 }
 
 sub cmd_stat {