Eric Wong [Mon, 23 Apr 2018 05:06:00 +0000 (05:06 +0000)]
search: avoid repeated mbox results from search
Previous search queries already set sort order on the Enquire
object, altering the ordering of results and was causing
messages to be redundantly downloaded via POST /$INBOX/?q=$QUERY&x=m
So stop caching the Search::Xapian::Enquire object since it
wasn't providing any measurable performance improvement.
Eric Wong [Mon, 23 Apr 2018 04:16:53 +0000 (04:16 +0000)]
view: wrap To: and Cc: headers in HTML display
It is common to have large amounts of addresses Cc:-ed in large
mailing lists like LKML. Make them more readable by wrapping
after addresses. Unfortunately, line breaks inserted by the
MUA get lost when using the public Email::MIME API.
Subject and body lines remain unwrapped, as it's the author's
fault to have such long lines :P
Eric Wong [Mon, 23 Apr 2018 04:16:52 +0000 (04:16 +0000)]
view: untangle loop when showing message headers
The old loop did not help with code clarity with the various
conditional statements. It also hid a bug where we forgot to
(optionally) obfuscate email addresses in Subject: lines if
search was enabled.
Eric Wong (Contractor, The Linux Foundation) [Sun, 22 Apr 2018 08:01:48 +0000 (08:01 +0000)]
extmsg: use Xapian only for partial matches
"LIKE" in SQLite (and other SQL implementations I've seen) is
expensive with nearly 3 million messages in the archives.
This caused some partial Message-ID lookups to take over 600ms
on my workstation (~300ms on a faster Xeon). Cut that to below
under 30ms on average on my workstation by relying exclusively
on Xapian for partial Message-ID lookups as we have in the past.
Unlike in the past when we tried using Xapian to match partial
Message-IDs; we now optimize our indexing of Message-IDs to
break apart "words" in Message-IDs for searching, yielding
(hopefully) "good enough" accuracy for folks who get long URLs
broken across lines when copy+pasting.
We'll also drop the (in retrospect) pointless stripping of
"/[tTf]" suffixes for the partial match, since anybody who
hits that codepath would be hitting an invalid message ID.
Finally, limit wildcard expansion to prevent easy DoS vectors
on short terms.
And blame Pine and alpine for generating Message-IDs with
low-entropy prefixes :P
Eric Wong [Fri, 20 Apr 2018 07:21:56 +0000 (07:21 +0000)]
convert: copy description and git config from v1 repo
I noticed I lost a $GIT_DIR/description in a conversion, so we
should preserve it. While we're at it, we ought to copy any
config in the old repo to the new one.
We will need to warn about cloneurl since it's unfortunately
not an automatic process to update. Oh well..
Eric Wong [Fri, 20 Apr 2018 03:27:38 +0000 (03:27 +0000)]
searchidx: release lock again during v1 batch callback
Relaxing this lock during a v1 --reindex is important to keep
messages showing up in -watch process in a timely manner.
Looks like I deleted an extra line when doing the following
for v2:
s/xdb->commit_transaction/self->commit_txn_lazy/
Fixes: 35ff6bb106909b1c ("replace Xapian skeleton with SQLite overview DB")
Eric Wong [Thu, 19 Apr 2018 22:42:05 +0000 (22:42 +0000)]
filter/rubylang: do not set altid on spam training
I suppose it's a bug or inconsistency that altid is write-only
and their deletions do not get reflected. But for now, we
do not set it when training spam so there's no window where
an invalid NNTP article number shows up.
This should solve the problem where there's massive gaps
in messages solved by spam training for ruby groups:
Eric Wong (Contractor, The Linux Foundation) [Wed, 18 Apr 2018 20:58:35 +0000 (20:58 +0000)]
Merge remote-tracking branch 'origin/master' into v2
* origin/master:
nntp: allow and ignore empty commands
mbox: do not barf on queries which return no results
nntp: fix NEWNEWS command
searchview: fix non-numeric comparison
Allow specification of the number of search results to return
githttpbackend: avoid infinite loop on generic PSGI servers
http: fix modification of read-only value
extmsg: use news.gmane.org for Message-ID lookups
extmsg: rework partial MID matching to favor current inbox
Update the installation instructions with Fedora package names
nntp: do not drain rbuf if there is a command pending
nntp: improve fairness during XOVER and similar commands
searchidx: do not modify Xapian DB while iterating
Don't use LIMIT in UPDATE statements
Eric Wong (Contractor, The Linux Foundation) [Wed, 18 Apr 2018 09:13:14 +0000 (09:13 +0000)]
extmsg: remove expensive git path checks
Searching across different inboxes is expensive without
SQLite (or Xapian) installed, so avoid doing expensive tree
lookups in git. Since SQLite is required for Xapian
support anyways, we won't need to check Xapian, either.
Sites without SQLite installed will simply 404 if somebody
requests a message which isn't in the current inbox.
Eric Wong (Contractor, The Linux Foundation) [Wed, 18 Apr 2018 09:13:13 +0000 (09:13 +0000)]
searchidx: regenerate and avoid article number gaps on full index
Some messages to git@vger went missing from Msgmap from old bugs
and became inaccessible via NNTP. Forcing NNTP article numbers
when the overview DB came about made the problem more visible when
reindexing old (v1) repositories as all removed spam messages
took up AUTOINCREMENT numbers again before they were removed.
Having large gaps in NNTP article numbers is not good since it
throws off NNTP clients. This does NOT prevent NNTP clients from
seeing some messages twice, but is better than having them
miss several messages entirely.
We also avoid depending on --reverse in git-log, as
git requires storing an entire commit list in memory for
--reverse, so it's cheaper to store only deleted blobs in the %D
hash since they do not live long.
Eric Wong (Contractor, The Linux Foundation) [Wed, 18 Apr 2018 09:13:11 +0000 (09:13 +0000)]
v2: improve deduplication checks
First off, decode text portions of messages since some archived
mail I got was converted from quoted-printable or base-64 to
8bit by the original recipient. Attempting to merge them with
my own archives (which had no conversion done) led to
unnecessary duplicates showing up.
Then, normalize CRLF line endings in text portions to LF.
In the headers, we relax the content_id hashing to ignore quotes
and lower-case domain names in To, Cc, and From headers since
some mail processors will alter them.
Finally, I've discovered Email::MIME->new($mime->as_string)
does not always round-trip reliably, so we calculate the
content_id twice on user-supplied messages.
Eric Wong (Contractor, The Linux Foundation) [Wed, 18 Apr 2018 09:13:10 +0000 (09:13 +0000)]
v2: generate better Message-IDs for duplicates
While hunting duplicates, I noticed a leading '-' in some
Message-IDs as a result of RFC4648 encoding. While '-' seems
allowed by RFC5322 and URL-friendly (RFC4648), they are uncommon
and make using Message-IDs as arguments for command-line tools
more difficult. So prefix them with a datestamp to at least
give readers some sense of the age. And shorten the "localhost"
hostname to "z" to save space.
Eric Wong (Contractor, The Linux Foundation) [Wed, 18 Apr 2018 09:13:08 +0000 (09:13 +0000)]
v2writable: reduce partititions by one
git fast-import and the main V2Writable process combined takes
about one CPU, so avoid having too many Xapian partitions which
cause unnecessary I/O contention.
Eric Wong (Contractor, The Linux Foundation) [Sat, 7 Apr 2018 03:41:54 +0000 (03:41 +0000)]
msgmap: speed up minmax with separate queries
This significantly improves the performance of the NNTP GROUP
command with 2.7 million messages from over 250ms to 700us.
SQLite is weird about this, but at least there's a way to
optimize it.
Eric Wong (Contractor, The Linux Foundation) [Sat, 7 Apr 2018 03:41:53 +0000 (03:41 +0000)]
store less data in the Xapian document
Since we only query the SQLite over DB for OVER/XOVER; do not
need to waste space storing fields To/Cc/:bytes/:lines or the
XNUM term. We only use From/Subject/References/Message-ID/:blob
in various places of the PSGI code.
For reindexing, we will take advantage of docid stability
in "xapian-compact --no-renumber" to ensure duplicates do not
show up in search results. Since the PSGI interface is the
only consumer of Xapian at the moment, it has no need to
search based on NNTP article number.
Eric Wong (Contractor, The Linux Foundation) [Sat, 7 Apr 2018 03:41:50 +0000 (03:41 +0000)]
v2writable: reduce barriers
Since we handle the overview info synchronously, we only need
barriers in tests, now. We will use asynchronous checkpoints
to sync less-important Xapian data.
For data deduplication, this requires us to hoist out the
cat-blob support in ::Import for reading uncommitted data
in git.
Eric Wong (Contractor, The Linux Foundation) [Sat, 7 Apr 2018 03:41:49 +0000 (03:41 +0000)]
over: remove forked subprocess
Since the overview stuff is a synchronization point anyways,
move it into the main V2Writable process and allow us to
drop a bunch of code. This is another step towards making
Xapian optional for v2.
In other words, the fan-out point is moved and the Xapian
partitions no longer need to synchronize against each other:
Before:
/-------->\
/---------->\
v2writable -->+----parts----> over
\---------->/
\-------->/
Since the overview/threading logic needs to run on the same core
that feeds git-fast-import, it's slower for small repos but is
not noticeable in large imports where I/O wait in the partitions
dominates.
Eric Wong (Contractor, The Linux Foundation) [Fri, 6 Apr 2018 21:44:38 +0000 (21:44 +0000)]
www: favor reading more from SQLite, and less from Xapian
Favor simpler internal APIs this time around, this cuts
a fair amount of code out and takes another step towards
removing Xapian as a dependency for v2 repos.
Eric Wong (Contractor, The Linux Foundation) [Thu, 5 Apr 2018 21:45:28 +0000 (21:45 +0000)]
search: index and allow searching by date-time
Dscho found this useful for finding matching git commits based
on AuthorDate in git. Add it to the overview DB format, too;
so in the future we can support v2 repos without Xapian.
Eric Wong (Contractor, The Linux Foundation) [Thu, 5 Apr 2018 09:34:12 +0000 (09:34 +0000)]
compact: better handling of over.sqlite3* files
Lets not scare users when they encounter files that are supposed
to be there. Then, preserve the journal and pipe.lock, even if
they're supposedly unused due to us holding the inbox-wide lock.
Eric Wong (Contractor, The Linux Foundation) [Wed, 4 Apr 2018 21:24:59 +0000 (21:24 +0000)]
v2: support incremental indexing + purge
This is important for people running mirrors via "git fetch",
as they need to be kept up-to-date. Purging is also now
supported in mirrors.
The short-lived "--regenerate" option is gone and is now
implicitly enabled as a result. It's still cheap when
article number regeneration is unnecessary, as we track
the range for each git repository.
Eric Wong (Contractor, The Linux Foundation) [Wed, 4 Apr 2018 21:11:47 +0000 (21:11 +0000)]
searchidx: ensure duplicated Message-IDs can be linked together
This allows us to emulate the display of thread-aware MUAs when
multiple messages share the same Message-ID. This also is a
place where "public-inbox-index --reindex" is useful to fix
existing messages and no schema version bump is necessary.
Eric Wong (Contractor, The Linux Foundation) [Tue, 3 Apr 2018 11:09:12 +0000 (11:09 +0000)]
nntp: simplify the long_response API
We we worked around the default range/termination conditions of
long_response in many cases to reduce calls to SQLite or Xapian.
So continue that trend and become more like the PSGI API
which doesn't force callers to specify an article range or
work inside a loop.
Eric Wong (Contractor, The Linux Foundation) [Tue, 3 Apr 2018 11:09:11 +0000 (11:09 +0000)]
msgmap: replace id_batch with ids_after
id_batch had a an overly complicated interface, replace it
with id_batch which is simpler and takes advantage of
selectcol_arrayref in DBI. This allows simplification of
callers and the diffstat agrees with me.
Eric Wong (Contractor, The Linux Foundation) [Tue, 3 Apr 2018 11:09:09 +0000 (11:09 +0000)]
view: avoid offset during pagination
OFFSET in SQLite gets painful to deal with. Instead,
rely on timestamps (from Received:) for pagination.
This also sets us up for more precise Date searching
in case we want it.
Eric Wong (Contractor, The Linux Foundation) [Tue, 3 Apr 2018 11:09:08 +0000 (11:09 +0000)]
nntp: make XOVER, XHDR, OVER, HDR and NEWNEWS faster
While SQLite is faster than Xapian for some queries we
use, it sucks at handling OFFSET. Fortunately, we do
not need offsets when retrieving sorted results and
can bake it into the query.
For inbox.comp.version-control.git (v1 Xapian),
XOVER and XHDR are over 20x faster.
Eric Wong (Contractor, The Linux Foundation) [Mon, 2 Apr 2018 00:04:56 +0000 (00:04 +0000)]
over: speedup get_thread by avoiding JOIN
JOIN operations on SQLite can be disasterously slow.
This reduces per-message pages with the thread overview
at the bottom of those pages from over 800ms to ~60ms.
In comparison, the v1 code took around 70-80ms using
Xapian on my machine.
Eric Wong (Contractor, The Linux Foundation) [Mon, 2 Apr 2018 00:04:55 +0000 (00:04 +0000)]
www: rework query responses to avoid COUNT in SQLite
In many cases, we do not care about the total number of
messages. It's a rather expensive operation in SQLite
(Xapian only provides an estimate).
For LKML, this brings top-level /$INBOX/ loading time from
~375ms to around 60ms on my system. Days ago, this operation
was taking 800-900ms(!) for me before introducing the SQLite
overview DB.
Eric Wong (Contractor, The Linux Foundation) [Mon, 2 Apr 2018 00:04:53 +0000 (00:04 +0000)]
v2writable: simplify barrier vs checkpoints
searchidx_checkpoint was too convoluted and confusing.
Since barrier is mostly the same thing; use that instead
and add an fsync option for the overview DB.
Eric Wong (Contractor, The Linux Foundation) [Mon, 2 Apr 2018 00:04:52 +0000 (00:04 +0000)]
replace Xapian skeleton with SQLite overview DB
This ought to provide better performance and scalability
which is less dependent on inbox size. Xapian does not
seem optimized for some queries used by the WWW homepage,
Atom feeds, XOVER and NEWNEWS NNTP commands.
This can actually make Xapian optional for NNTP usage,
and allow more functionality to work without Xapian
installed.
Indexing performance was extremely bad at first, but
DBI::Profile helped me optimize away problematic queries.
Eric Wong (Contractor, The Linux Foundation) [Sun, 1 Apr 2018 23:23:07 +0000 (23:23 +0000)]
v2writable: fix parallel termination
I was too aggressively disabling parallelization to speed up
the test suite and broke this :x Re-enable parallelization
for the v2reindex test so we can catch it later.
Eric Wong (Contractor, The Linux Foundation) [Sun, 1 Apr 2018 23:15:04 +0000 (23:15 +0000)]
v2: one file, really
We need to ensure there is only one file in the top-level tree
at any commit so the "add; remove; add;" sequence on the same
message is detected properly.
Otherwise, git will not detect the second "add" unless
a second message is added to history.
Deletes are now stored in "d" (and not "D" or "_/D") at the
top-level, now. There's no need to have a "_" to reduce churn
as "m" and "d" should never co-exist. It's now lowercased to
make it easier-to-distinguish from "D" in git-log output.
Eric Wong (Contractor, The Linux Foundation) [Fri, 30 Mar 2018 01:20:48 +0000 (01:20 +0000)]
feed: optimize query for feeds, too
This is a smaller improvement than the landing /$INBOX/ page
because full message bodies are shown; but still saves around
100ms for my system with LKML.
Eric Wong (Contractor, The Linux Foundation) [Fri, 30 Mar 2018 01:20:46 +0000 (01:20 +0000)]
view: drop load_results
It's no longer necessary to have this since load_expand
now populates $smsg->mid with the "preferred" Message-ID.
This saves around 10ms on the homepage for me.
Eric Wong (Contractor, The Linux Foundation) [Fri, 30 Mar 2018 01:20:44 +0000 (01:20 +0000)]
v2writable: go backwards through alternate Message-IDs
This is consistent with how we internally generate new
Message-IDs to break conflicts and allows ->reindex to
succeed while walking backwards through history
Eric Wong (Contractor, The Linux Foundation) [Thu, 29 Mar 2018 20:17:19 +0000 (20:17 +0000)]
public-inbox-compact: new tool for driving xapian-compact
Having multiple Xapian partitions is mostly pointless after
the initial import. We can compact all the partitions into
one while keeping the skeleton separate.