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 <e@80x24.org>2018-03-19 07:51:59 +0000
commit79c034bf6e2a64c09d77e2ac4bf734347d686559 (patch)
treee894d086313b6d47c11b2fd7ad54efd97b96f308 /lib/PublicInbox/ExtMsg.pm
parentbbba974cc2b93a13c79312fdc3a0567059471e2e (diff)
downloadpublic-inbox-79c034bf6e2a64c09d77e2ac4bf734347d686559.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 ab9591f9..e0aabfb1 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: