4 years agopublic-inbox 1.1.0-pre1 v1.1.0-pre1
Eric Wong [Wed, 9 May 2018 20:09:52 +0000 (20:09 +0000)]
public-inbox 1.1.0-pre1

Pre-release for v2 repository support.  Thanks to
The Linux Foundation for supporting this work!

4 years agoscripts/import_slrnspool: cleanup progress messages
Eric Wong [Wed, 2 May 2018 20:55:17 +0000 (20:55 +0000)]
scripts/import_slrnspool: cleanup progress messages

Stop showing redundant slashes and stop showing progress
for messages which do not exist.

4 years agoscripts/import_slrnspool: support v2 repos
Eric Wong [Wed, 2 May 2018 20:54:35 +0000 (20:54 +0000)]
scripts/import_slrnspool: support v2 repos

4 years agosearchidx: preserve umask when starting/committing transactions
Eric Wong [Tue, 1 May 2018 01:51:41 +0000 (01:51 +0000)]
searchidx: preserve umask when starting/committing transactions

Xapian will replace files upon committing, so non-parallel
V2Writable users need to have umask preserved this way.

4 years agothread: sort incoming messages by Date
Eric Wong [Wed, 25 Apr 2018 08:52:49 +0000 (08:52 +0000)]
thread: sort incoming messages by Date

Improve the display by finding any parent when we see out-of-order
References.  This prevents us from having two roots in the test
case like Mail::Thread does.

4 years agothread: prevent hidden threads in /$INBOX/ landing page
Eric Wong [Wed, 25 Apr 2018 08:52:48 +0000 (08:52 +0000)]
thread: prevent hidden threads in /$INBOX/ landing page

In retrospect, the loop prevention done by our indexer is not
always sufficient since it can have an improperly sorted
or incomplete References headers.

This bug was triggered multiple bracketed Message-IDs in an
In-Reply-To: header (not References) where the Message-IDs were
in non-chronological order when somebody tried to reply to
different leafs of a thread with a single message.

So we must check for descendents before blindly trying to
use the last one.

Fixes: c6a8fdf71e2c336f ("thread: last Reference always wins")
4 years agomsgmap: add limit to response for NNTP
Eric Wong [Tue, 24 Apr 2018 19:43:25 +0000 (19:43 +0000)]
msgmap: add limit to response for NNTP

All callers in expect to iterate through results.  This
was causing unfairness when fetching large ranges via XHDR
as rtin does :<

Fixes: b8c41362f2a5c8fc "nntp: simplify the long_response API"
4 years agosearch: avoid repeated mbox results from search
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.

4 years agosearchview: do not blindly append "l" parameter to URL
Eric Wong [Mon, 23 Apr 2018 04:46:41 +0000 (04:46 +0000)]
searchview: do not blindly append "l" parameter to URL

It's ugly and all of our other parameters are omitted
when values are not the default.

4 years agoTODO: add EPOLLEXCLUSIVE item
Eric Wong [Fri, 20 Apr 2018 10:27:21 +0000 (10:27 +0000)]

Threads are generally discouraged in Perl5, so I won't be using
a dedicated blocking accept4() thread like I would in other

4 years agoview: drop redundant References: display code
Eric Wong [Mon, 23 Apr 2018 04:16:54 +0000 (04:16 +0000)]
view: drop redundant References: display code

We no longer need to parse and dedupe References:
ourselves, PublicInbox::MID::references does it for us.

4 years agoview: wrap To: and Cc: headers in HTML display
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

4 years agoview: untangle loop when showing message headers
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.

4 years agoextmsg: use Xapian only for partial matches
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

4 years agoconvert: copy description and git config from v1 repo
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..

4 years agosearchidx: remove leftover debugging code
Eric Wong [Fri, 20 Apr 2018 03:27:39 +0000 (03:27 +0000)]
searchidx: remove leftover debugging code

I was using this to trace the path of brian's message.

Fixes: 017fed7bc4d33ac4
("searchidx: regenerate and avoid article number gaps on full index")

4 years agosearchidx: release lock again during v1 batch callback
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:


Fixes: 35ff6bb106909b1c ("replace Xapian skeleton with SQLite overview DB")
4 years agodisallow "\t" and "\n" in OVER headers
Eric Wong [Fri, 20 Apr 2018 03:27:37 +0000 (03:27 +0000)]
disallow "\t" and "\n" in OVER headers

For Subject/To/Cc/From headers, we squeeze them to a space (' ').

For Message-IDs (including References/In-Reply-To), '\t', '\n', '\r'
are deleted since some MUAs might screw them up:

4 years agoimport: cleanup git cat-file processes when ->done
Eric Wong [Fri, 20 Apr 2018 02:01:04 +0000 (02:01 +0000)]
import: cleanup git cat-file processes when ->done

This should reduce idle cat-file instances

4 years agofilter/rubylang: do not set altid on spam training
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:

4 years agoTODO: a few more updates
Eric Wong [Thu, 19 Apr 2018 19:43:59 +0000 (19:43 +0000)]
TODO: a few more updates

Mainly, v2 stuff is done

4 years agofix tests to run without Xapian installed
Eric Wong (Contractor, The Linux Foundation) [Thu, 19 Apr 2018 19:23:32 +0000 (19:23 +0000)]
fix tests to run without Xapian installed

We'll be ensuring we can run more of the HTTP and all of the
NNTP interface with only SQLite (and not Xapian) installed
in the future.

4 years agoensure SQLite and Xapian files respect core.sharedRepository
Eric Wong [Wed, 18 Apr 2018 23:27:44 +0000 (23:27 +0000)]
ensure SQLite and Xapian files respect core.sharedRepository

We can't have files with permissions inconsistent with what's
in git objects.

4 years agoMerge remote-tracking branch 'origin/master' into v2
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 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

4 years agosearchidx: revert default BATCH_BYTES to 1_000_000
Eric Wong (Contractor, The Linux Foundation) [Wed, 18 Apr 2018 20:33:56 +0000 (20:33 +0000)]
searchidx: revert default BATCH_BYTES to 1_000_000

This increases indexing time by around 10% but roughly
halves memory usage of an -index process.

We will probably make this tunable in the future for people
with bigger/smaller machines.

4 years agonntp: allow and ignore empty commands
Eric Wong [Wed, 18 Apr 2018 20:30:22 +0000 (20:30 +0000)]
nntp: allow and ignore empty commands

Somebody hitting "\n" into telnet shouldn't hold a client up
indefinitely and prevent shutdown.

4 years agosearchidx: increase term positions for all text terms
Eric Wong (Contractor, The Linux Foundation) [Wed, 18 Apr 2018 09:13:16 +0000 (09:13 +0000)]
searchidx: increase term positions for all text terms

We do not want phrase searches to cross between independent
fields (filenames/Message-ID vs bodies)

4 years agouse %H consistently to disable abbreviations
Eric Wong (Contractor, The Linux Foundation) [Wed, 18 Apr 2018 09:13:15 +0000 (09:13 +0000)]
use %H consistently to disable abbreviations

We generally do not want git to waste time finding abbreviations
and we do not want the possibility of them becoming ambiguous
over time, either.

4 years agoextmsg: remove expensive git path checks
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.

4 years agosearchidx: regenerate and avoid article number gaps on full index
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.

4 years agoimport: cat_blob drops leading 'From ' lines like Inbox
Eric Wong (Contractor, The Linux Foundation) [Wed, 18 Apr 2018 09:13:12 +0000 (09:13 +0000)]
import: cat_blob drops leading 'From ' lines like Inbox

In case people were running old buggy versions from 2016...
(and -convert should probably clean those up, eventually)

4 years agov2: improve deduplication checks
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.

4 years agov2: generate better Message-IDs for duplicates
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.

4 years agosearch: preserve References in Xapian smsg for x=t view
Eric Wong (Contractor, The Linux Foundation) [Wed, 18 Apr 2018 09:13:09 +0000 (09:13 +0000)]
search: preserve References in Xapian smsg for x=t view

I'm not sure how useful this view is, but it exists for now.

4 years agov2writable: reduce partititions by one
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.

4 years agocompact: do not merge v2 repos by default
Eric Wong (Contractor, The Linux Foundation) [Wed, 18 Apr 2018 09:13:07 +0000 (09:13 +0000)]
compact: do not merge v2 repos by default

--no-renumber does not allow merging, and merging is not ideal
for reindexing, either.

4 years agov1: remove articles from overview DB
Eric Wong (Contractor, The Linux Foundation) [Wed, 18 Apr 2018 09:13:06 +0000 (09:13 +0000)]
v1: remove articles from overview DB

Otherwise articles show up again...

4 years agofeed: respect feedmax, again
Eric Wong (Contractor, The Linux Foundation) [Wed, 18 Apr 2018 09:13:05 +0000 (09:13 +0000)]
feed: respect feedmax, again

Gigantic feeds probably make some clients unhappy,
clamp it to what it was in the past.

Fixes: b9534449ecce2c59 ("view: avoid offset during pagination")
4 years agomsgmap: speed up minmax with separate queries
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.

4 years agostore less data in the Xapian document
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.

4 years agoconvert: support converting with altid defined
Eric Wong (Contractor, The Linux Foundation) [Sat, 7 Apr 2018 03:41:52 +0000 (03:41 +0000)]
convert: support converting with altid defined

public-inbox-convert ought to be 100% lossless, now

4 years agoindex: allow specifying --jobs=0 to disable multiprocess
Eric Wong (Contractor, The Linux Foundation) [Sat, 7 Apr 2018 03:41:51 +0000 (03:41 +0000)]
index: allow specifying --jobs=0 to disable multiprocess

Not everybody needs multiprocess support.

4 years agov2writable: reduce barriers
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.

4 years agoover: remove forked subprocess
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:

     v2writable -->+----parts----> over


  v2writable --> over-->+----parts--->

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

4 years agoover: avoid excessive SELECT
Eric Wong (Contractor, The Linux Foundation) [Sat, 7 Apr 2018 03:41:48 +0000 (03:41 +0000)]
over: avoid excessive SELECT

No need to read what we don't need into the Perl process.
Fix some broken capitalization while we're at it.

4 years agopsgi: ensure /$INBOX/$MESSAGE_ID/T/ endpoint is chronological
Eric Wong (Contractor, The Linux Foundation) [Sat, 7 Apr 2018 03:41:47 +0000 (03:41 +0000)]
psgi: ensure /$INBOX/$MESSAGE_ID/T/ endpoint is chronological

We only need to call get_thread beyond 1000 messages for
fetching entire mboxes.  It's probably too much for the HTML
display otherwise.

4 years agoensure Xapian and SQLite are still optional for v1 tests
Eric Wong (Contractor, The Linux Foundation) [Fri, 6 Apr 2018 21:44:39 +0000 (21:44 +0000)]
ensure Xapian and SQLite are still optional for v1 tests

Xapian is size-intensive and SQLite is not strictly necessary for v1.

4 years agowww: favor reading more from SQLite, and less from Xapian
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.

4 years agonntp: set Xref across multiple inboxes
Eric Wong (Contractor, The Linux Foundation) [Fri, 6 Apr 2018 21:44:37 +0000 (21:44 +0000)]
nntp: set Xref across multiple inboxes

Noted by Jonathan Corbet in

4 years agoaltid: fix miscopied field name
Eric Wong (Contractor, The Linux Foundation) [Fri, 6 Apr 2018 21:44:36 +0000 (21:44 +0000)]
altid: fix miscopied field name

Oops :x

4 years agosearch: index and allow searching by date-time
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.

4 years agoover: use only supported and safe SQLite APIs
Eric Wong (Contractor, The Linux Foundation) [Thu, 5 Apr 2018 21:45:27 +0000 (21:45 +0000)]
over: use only supported and safe SQLite APIs

Some of this jankiness was from early performance problems
and they turned out to be unnecessary measures.

4 years agov2writable: refer to git each repository as "epoch"
Eric Wong (Contractor, The Linux Foundation) [Thu, 5 Apr 2018 21:45:26 +0000 (21:45 +0000)]
v2writable: refer to git each repository as "epoch"

This hopefully helps for people who try to understand
this design.

4 years agov2writable: allow tracking parallel versions
Eric Wong (Contractor, The Linux Foundation) [Thu, 5 Apr 2018 21:45:25 +0000 (21:45 +0000)]
v2writable: allow tracking parallel versions

For upgrades, this will let users keep an old version
running while performing "public-inbox-index" on the
newest version.

4 years agov2writable: remove redundant remove from Over DB
Eric Wong (Contractor, The Linux Foundation) [Thu, 5 Apr 2018 10:03:20 +0000 (10:03 +0000)]
v2writable: remove redundant remove from Over DB

The Xapian partitions will trigger the removal anyways.
Test this and fix some description/spelling errors
while we're at it.

4 years agocompact: better handling of over.sqlite3* files
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.

4 years agosupport altid mechanism for v2
Eric Wong (Contractor, The Linux Foundation) [Thu, 5 Apr 2018 09:34:11 +0000 (09:34 +0000)]
support altid mechanism for v2

There's enough gmane links out there in wild that it makes sense
to maintain support for these mappings.

4 years agosearchview: minor cleanup
Eric Wong (Contractor, The Linux Foundation) [Thu, 5 Apr 2018 09:34:10 +0000 (09:34 +0000)]
searchview: minor cleanup

$mset->size is probably more obvious than relying on a tied
array and saves us a line.

4 years agombox: do not sort search results
Eric Wong (Contractor, The Linux Foundation) [Thu, 5 Apr 2018 09:34:09 +0000 (09:34 +0000)]
mbox: do not sort search results

Sorting large msets is a waste when it comes to mboxes
since MUAs should thread and sort them as the user desires.

This forces us to rework each of the mbox download mechanisms
to be more independent of each other, but might make things
easier to reason about.

4 years agosearch: remove unnecessary OP_AND of query
Eric Wong (Contractor, The Linux Foundation) [Thu, 5 Apr 2018 09:34:08 +0000 (09:34 +0000)]
search: remove unnecessary OP_AND of query

This was vestigial code from the switch to the overview DB

4 years agosearchmsg: remove unused `tid' and `path' methods
Eric Wong (Contractor, The Linux Foundation) [Thu, 5 Apr 2018 09:34:07 +0000 (09:34 +0000)]
searchmsg: remove unused `tid' and `path' methods

These internal attributes are not exposed and no longer
used in our APIs.

4 years agov2writable: recount partitions after acquiring lock
Eric Wong (Contractor, The Linux Foundation) [Thu, 5 Apr 2018 09:34:06 +0000 (09:34 +0000)]
v2writable: recount partitions after acquiring lock

The partition count can change if public-inbox-compact runs
while public-inbox-watch or public-inbox-index is running.

4 years agov2writable: do not modify DBs while iterating for ->remove
Eric Wong (Contractor, The Linux Foundation) [Wed, 4 Apr 2018 21:25:00 +0000 (21:25 +0000)]
v2writable: do not modify DBs while iterating for ->remove

Xapian may become unhappy if a DB is modified during iteration:

4 years agov2: support incremental indexing + purge
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.

4 years agoimport: rewrite less history during purge
Eric Wong (Contractor, The Linux Foundation) [Wed, 4 Apr 2018 21:24:58 +0000 (21:24 +0000)]
import: rewrite less history during purge

We do not need to rewrite old commits unaffected by the object_id
purge, only newer commits.  This was a state management bug :x

We will also return the new commit ID of rewritten history to
aid in incremental indexing of mirrors for the next change.

4 years agoinit: s/GIT_DIR/REPO_DIR/ in usage
Eric Wong (Contractor, The Linux Foundation) [Wed, 4 Apr 2018 21:24:57 +0000 (21:24 +0000)]
init: s/GIT_DIR/REPO_DIR/ in usage

4 years agosearchidx: ensure duplicated Message-IDs can be linked together
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.

4 years agonntp: simplify the long_response API
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.

4 years agomsgmap: replace id_batch with ids_after
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.

4 years agombox: remove remaining OFFSET usage in SQLite
Eric Wong (Contractor, The Linux Foundation) [Tue, 3 Apr 2018 11:09:10 +0000 (11:09 +0000)]
mbox: remove remaining OFFSET usage in SQLite

We can use id_batch in the common case to speed up full mbox
retrievals.  Gigantic msets are still a problem, but will
be fixed in future commits.

4 years agoview: avoid offset during pagination
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.

4 years agonntp: make XOVER, XHDR, OVER, HDR and NEWNEWS faster
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.

4 years agorename+rewrite test using Benchmark module
Eric Wong (Contractor, The Linux Foundation) [Tue, 3 Apr 2018 11:09:07 +0000 (11:09 +0000)]
rename+rewrite test using Benchmark module

There'll be more performance-related tests in the future.

4 years agot/thread-all.t: modernize test to support modern inboxes
Eric Wong (Contractor, The Linux Foundation) [Tue, 3 Apr 2018 11:09:06 +0000 (11:09 +0000)]
t/thread-all.t: modernize test to support modern inboxes

We'll be adding more tests in the same vein as this
to improve NNTP performance.

4 years agombox: do not barf on queries which return no results
Eric Wong [Tue, 3 Apr 2018 10:34:54 +0000 (10:34 +0000)]
mbox: do not barf on queries which return no results

Having zero search results means we never get a chance
to populate the Content-Disposition header for mbox

4 years agonntp: fix NEWNEWS command
Eric Wong (Contractor, The Linux Foundation) [Sat, 3 Mar 2018 20:18:34 +0000 (20:18 +0000)]
nntp: fix NEWNEWS command

I guess nobody uses this command (slrnpull does not), and
the breakage was not noticed until I started writing new
tests for multi-MID handling.

Fixes: 3fc411c772a21d8f ("search: drop pointless range processors for Unix timestamp")
4 years agoover: speedup get_thread by avoiding JOIN
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.

4 years agowww: rework query responses to avoid COUNT in SQLite
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.

4 years agot/over: test empty Subject: line matching
Eric Wong (Contractor, The Linux Foundation) [Mon, 2 Apr 2018 00:04:54 +0000 (00:04 +0000)]
t/over: test empty Subject: line matching

We need to ensure we don't match NULL 'sid' columns in the
`over' table.

4 years agov2writable: simplify barrier vs checkpoints
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.

4 years agoreplace Xapian skeleton with SQLite 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

Indexing performance was extremely bad at first, but
DBI::Profile helped me optimize away problematic queries.

4 years agosearch: reduce columns stored in Xapian
Eric Wong (Contractor, The Linux Foundation) [Sun, 1 Apr 2018 06:30:37 +0000 (06:30 +0000)]
search: reduce columns stored in Xapian

We can store :bytes and :lines in doc_data since we never
sort or search by them.  We don't have much use for the Date:
stamp at the moment, either.

4 years agoscripts/import_vger_from_mbox: set address properly
Eric Wong (Contractor, The Linux Foundation) [Sun, 1 Apr 2018 23:24:26 +0000 (23:24 +0000)]
scripts/import_vger_from_mbox: set address properly

For objects like Inbox; the '-' prefixed hash keys are
probably intended for auto-generated/hidden parameters.

4 years agotruncate Message-IDs and References consistently
Eric Wong (Contractor, The Linux Foundation) [Sun, 1 Apr 2018 23:23:44 +0000 (23:23 +0000)]
truncate Message-IDs and References consistently

We need to stop ghost messages from generating longer
Message-IDs than Xapian can handle with terms.

4 years agov2writable: fix parallel termination
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.

4 years agov2: one file, really
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.

4 years agosearchview: fix non-numeric comparison
Eric Wong [Sun, 1 Apr 2018 22:58:19 +0000 (22:58 +0000)]
searchview: fix non-numeric comparison

We don't want non-fully-numeric limits being compared and
tripping warnings.  While we're at it, avoid hard-coding
'200' and reuse $LIM as the default.

4 years agoAllow specification of the number of search results to return
Jonathan Corbet [Fri, 30 Mar 2018 21:25:57 +0000 (15:25 -0600)]
Allow specification of the number of search results to return

Add an "l=" parameter to the search query syntax to specify how many
results should be returned.

4 years agosearchidx: correct warning for over-vivification
Eric Wong (Contractor, The Linux Foundation) [Fri, 30 Mar 2018 20:55:13 +0000 (20:55 +0000)]
searchidx: correct warning for over-vivification

We will vivify multiple ghosts if a message has multiple

4 years agov2: respect core.sharedRepository in git configs
Eric Wong (Contractor, The Linux Foundation) [Fri, 30 Mar 2018 17:46:31 +0000 (17:46 +0000)]
v2: respect core.sharedRepository in git configs

Ensure -convert and -compact do not make repositories
unreadable on live servers.

4 years agot/v2writable: use simplify permissions reading
Eric Wong (Contractor, The Linux Foundation) [Fri, 30 Mar 2018 18:15:25 +0000 (18:15 +0000)]
t/v2writable: use simplify permissions reading

We have Git::qx nowadays.

4 years agosearch: move permissions handling to InboxWritable
Eric Wong (Contractor, The Linux Foundation) [Fri, 30 Mar 2018 18:03:01 +0000 (18:03 +0000)]
search: move permissions handling to InboxWritable

We'll be making sure V2Writable uses this.

4 years agoconvert: avoid redundant "done\n" statement for fast-import
Eric Wong (Contractor, The Linux Foundation) [Fri, 30 Mar 2018 20:31:48 +0000 (20:31 +0000)]
convert: avoid redundant "done\n" statement for fast-import

This bug was hidden due to timing problems with eatmydata or
running with tmpfs for TMPDIR.

4 years agomsgtime: parse 3-digit years properly
Eric Wong (Contractor, The Linux Foundation) [Fri, 30 Mar 2018 01:20:47 +0000 (01:20 +0000)]
msgtime: parse 3-digit years properly

Some folks had bad mail clients which generated 3-digit years
around Y2K...

4 years agofeed: optimize query for feeds, too
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.

4 years agoview: drop load_results
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.

4 years agoview: speed up homepage loading time with date clamp
Eric Wong (Contractor, The Linux Foundation) [Fri, 30 Mar 2018 01:20:45 +0000 (01:20 +0000)]
view: speed up homepage loading time with date clamp

This saves over 400ms on my system with the full LKML
with over 2.8 million messages.

4 years agov2writable: go backwards through alternate Message-IDs
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

4 years agowwwstream: flesh out clone instructions for v2
Eric Wong (Contractor, The Linux Foundation) [Fri, 30 Mar 2018 01:20:43 +0000 (01:20 +0000)]
wwwstream: flesh out clone instructions for v2

Relying solely on git for v2 repos is probably not
so useful, so add pointers to public-inbox-init/index

4 years agov2writable: convert some fatal reindex errors to warnings
Eric Wong (Contractor, The Linux Foundation) [Fri, 30 Mar 2018 01:20:42 +0000 (01:20 +0000)]
v2writable: convert some fatal reindex errors to warnings

By supporting purge and allowing users to delete git partitions,
we can open up ourselves to gaps and un-reindexible data.  Let
that be.