about summary refs log tree commit homepage
path: root/lib/PublicInbox/ExtMsg.pm
diff options
context:
space:
mode:
authorEric Wong (Contractor, The Linux Foundation) <e@80x24.org>2018-03-19 07:51:09 +0000
committerEric Wong (Contractor, The Linux Foundation) <e@80x24.org>2018-03-19 08:15:39 +0000
commit471cc731579002419d23f64509497dd486dd632c (patch)
treeac0b231d665b51b1d30bb3f3dd8592a93c4a79f2 /lib/PublicInbox/ExtMsg.pm
parentcab22861f2a22482b74d20c05afbd6108a4590cb (diff)
downloadpublic-inbox-471cc731579002419d23f64509497dd486dd632c.tar.gz
The current inbox is more important for partial Message-ID
matching, so we try harder on that to fix common errors before
moving onto other inboxes.  Then, prevent expensive scanning of
other inboxes by requiring a Message-ID length of at least 16
bytes.

Finally, we limit the overall partial responses to 200 when
scanning other inboxes to avoid excessive memory usage.
Diffstat (limited to 'lib/PublicInbox/ExtMsg.pm')
-rw-r--r--lib/PublicInbox/ExtMsg.pm26
1 files changed, 21 insertions, 5 deletions
diff --git a/lib/PublicInbox/ExtMsg.pm b/lib/PublicInbox/ExtMsg.pm
index f3076a34..c71510f5 100644
--- a/lib/PublicInbox/ExtMsg.pm
+++ b/lib/PublicInbox/ExtMsg.pm
@@ -84,17 +84,33 @@ sub ext_msg {
         my $n_partial = 0;
         my @partial;
 
-        eval { require PublicInbox::Msgmap };
-        my $have_mm = $@ ? 0 : 1;
-        if ($have_mm) {
+        if (my $mm = $cur->mm) {
+                my $tmp_mid = $mid;
+                my $res = $mm->mid_prefixes($tmp_mid, 100);
+                if ($res && scalar(@$res)) {
+                        $n_partial += scalar(@$res);
+                        push @partial, [ $cur, $res ];
+                # fixup common errors:
+                } elsif ($tmp_mid =~ s,/[tTf],,) {
+                        $res = $mm->mid_prefixes($tmp_mid, 100);
+                        if ($res && scalar(@$res)) {
+                                $n_partial += scalar(@$res);
+                                push @partial, [ $cur, $res ];
+                        }
+                }
+        }
+
+        # can't find a partial match in current inbox, try the others:
+        if (!$n_partial && length($mid) >= 16) {
                 my $tmp_mid = $mid;
 again:
-                unshift @ibx, $cur;
                 foreach my $ibx (@ibx) {
                         my $mm = $ibx->mm or next;
-                        if (my $res = $mm->mid_prefixes($tmp_mid)) {
+                        my $res = $mm->mid_prefixes($tmp_mid, 100);
+                        if ($res && scalar(@$res)) {
                                 $n_partial += scalar(@$res);
                                 push @partial, [ $ibx, $res ];
+                                last if $n_partial >= 100;
                         }
                 }
                 # fixup common errors: