Eric W. Biederman [Wed, 1 Aug 2018 16:43:36 +0000 (11:43 -0500)]
t/v[12]reindex.t: Test that the resulting msgmap is as expected
Deeply inspect the entire message map in the reindexing tests
as the actual message order is significant and can result
in surprises.
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Eric W. Biederman [Wed, 1 Aug 2018 16:43:35 +0000 (11:43 -0500)]
t/v[12]reindex.t: Place expected second in Xapian tests
Place the expected value second in is and isnt tests because when
these tests fail they report the second value as the expected value.
A report saying got 0 expected 8 'no Xapian search results' can be confusing.
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Eric W. Biederman [Wed, 1 Aug 2018 16:43:34 +0000 (11:43 -0500)]
t/v2reindex.t: Isolate the test cases more
While inspecting the tests I realized that because we have been
reusing variables there can be a memory between one test case and
another. Add scopes and local variables to prevent an unintended
memory between one test cases.
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Eric W. Biederman [Wed, 1 Aug 2018 16:43:33 +0000 (11:43 -0500)]
t/v1reindex.t: Isolate the test cases
While inspecting the tests I realized that because we have been
reusing variables there can be a memory between one test case and
another. Add scopes and local variables to prevent an unintended
memory between one test and another.
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Eric W. Biederman [Wed, 1 Aug 2018 16:43:32 +0000 (11:43 -0500)]
Import.pm: Don't assume {in} and {out} always exist
While working on one of the tests I did:
my $im = PublicInbox::V2Writable->new($ibx, 1);
my $im0 = $im->importer();
$im->add($mime);
Which resulted in a warning of the use of an undefined value from
atfork_child, and the test failing nastily. Inspection of the code
reveals this can happen anytime gfi_start has not been called.
So just fix atfork_child to skip closing file descriptors that have
not yet been setup.
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Eric W. Biederman [Mon, 30 Jul 2018 05:04:45 +0000 (00:04 -0500)]
ProcessPipe.pm: Use read not sysread
While playing with git fast export I discovered that mixing <> and
read would give inconsistent results. I tracked the issue down to
using sysread in ProcessPipe instead of plain read.
If it is desirable to use readline I can't see how using sysread
can work as readline to be efficient needs to use buffered I/O.
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Eric Wong [Sun, 29 Jul 2018 10:05:13 +0000 (10:05 +0000)]
mda: allow configuring globally without spamc support
This reuses some of the configuration from -watch, but remains
independent since some configurations will use -watch for some
inboxes and -mda for others.
The default remains "spamc" for -mda users so nothing changes
without explicit configuration.
Per-inbox configurations may also be supported in the future.
Eric Wong [Sun, 29 Jul 2018 09:34:41 +0000 (09:34 +0000)]
mda: v2: ensure message bodies are indexed
We must not clobber the original message string, as Email::MIME(*)
still needs it for iterating through parts in SearchIdx (but not
when handing it as a raw string to git-fast-import).
I've noticed message bodies (especially dfpre/dpost) were not
getting indexed when going through -mda (no problems with
-watch). This also did not affect v1 repos, since indexing is a
separate process for v1 and requires re-reading the data from
git.
(*) tested Email::MIME 1.937 on Debian stretch
Eric Wong [Sun, 29 Jul 2018 09:34:40 +0000 (09:34 +0000)]
t/v2mda: make it easy to test v1 repos here, too
It will help track down a bug which only seems to happen in v2 repos.
Eric Wong [Sun, 29 Jul 2018 09:34:39 +0000 (09:34 +0000)]
mda: use InboxWritable
It's a convenient wrapper nowadays, so get rid of some legacy
code and minimize differences from the -watch code.
Eric Wong [Fri, 20 Jul 2018 06:16:12 +0000 (06:16 +0000)]
search: use boolean prefixes for git blob queries
I've hit some case where probabilistic searches don't work when
using dfpre:/dfpost:/dfblob: search prefixes because stemming in
the query parser interferes.
In any case, our indexing code indexes longer/unabbreviated blob
names down to its 7 character abbreviation, so there should be
no need to do wildcard searches on git blob names.
Eric Wong [Fri, 20 Jul 2018 06:58:45 +0000 (06:58 +0000)]
v1: allow upgrading indexlevel=basic to 'medium' or 'full'
For v1 repos, we don't need to write any metadata to Xapian
and changing from 'basic' to 'medium' or 'full' will work.
For v2, the metadata for indexing is stored in msgmap (because
the Xapian databases are partitioned for parallelism), so a
reindex is required.
Eric Wong [Thu, 19 Jul 2018 21:43:10 +0000 (21:43 +0000)]
tests: fixup indexlevel setting in tests
The correct field is underscore-less for consistency with
git-config naming conventions. While we're at it, beef up
the v2 tests with actual size checks, too.
I also noticed phrase searching still seems to work for
the limited test case, so I left it documented; but the
size checking verifies the space savings.
Eric W. Biederman [Thu, 19 Jul 2018 19:36:31 +0000 (14:36 -0500)]
Import.pm: Deal with potentially missing From and Sender headers
Use ||= '' to ensure that if the From or Sender header is not present
the code sees an empty string and instead of undefined.
I had some email messages with a From field without an @ (because the
sender was local) and without a Sender which were causing errors when
imported. I think this was bad enough that the email messages were
failing to be imported.
Signed-off-by: Eric Biederamn <ebiederm@xmission.com>
Eric Wong [Thu, 19 Jul 2018 03:21:38 +0000 (03:21 +0000)]
searchidx: respect XAPIAN_FLUSH_THRESHOLD env if set
Xapian documents and respect XAPIAN_FLUSH_THRESHOLD to define
the interval in documents to flush, so don't override it with
our own BATCH_BYTES. This is helpful for initial indexing for
those on slower storage but enough RAM.
It is unnecessary for -watch and frequent incremental indexing;
and it increases transaction times if -watch is playing "catch-up"
if it was stopped for a while.
The original BATCH_BYTES was tuned for a machine with little
memory as the default XAPIAN_FLUSH_THRESHOLD of 10000 documents
was causing swap storms. Using document counts also proved an
innaccurate estimator of RAM usage compared to the actual bytes
processed.
Eric W. Biederman [Wed, 18 Jul 2018 17:32:34 +0000 (12:32 -0500)]
public-inbox-init: Initialize indexlevel
If indexlevel is specified on the command line prefer that.
If indexlevel is specified in the config file prefer that.
If indexlevel is not specified anywhere default to full.
This should make indexlevel somewhat approachable.
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Eric W. Biederman [Wed, 18 Jul 2018 16:53:25 +0000 (11:53 -0500)]
SearchIdx: Allow the amount of indexing be configured
This adds a new inbox configuration option 'indexlevel' that can take
the values 'full', 'medium', and 'basic'.
When set to 'full' everything is indexed including the positions
of all terms.
When set to 'medium' everything except the positions of terms is
indexed.
When set to 'basic' terms and positions are not indexed. Just the
Overview database for NNTP is created. Which is still quite good and
allows searching for messages by Message-ID. But there are no indexes to support
searching inside the email messages themselves.
Update the reindex tests to exercise the full medium and basic code paths
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Eric W. Biederman [Wed, 18 Jul 2018 16:53:24 +0000 (11:53 -0500)]
SearchIdx: Add the mechanism for making all Xapian indexing optional
Create a new method add_xapian that holds all of the code to create
Xapian indexes. The creation of this method simpliy involved
idenitifying the relevant code and moving it from add_message.
A call is added to add_xapian from add_message to keep everything
working as it currently does. The new call is made conditional upon
index levels of 'full' and 'medium'. The index levels that index
positions and terms the two things public-inbox uses Xapian to index.
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Eric W. Biederman [Wed, 18 Jul 2018 16:53:23 +0000 (11:53 -0500)]
SearchIdx.pm: Make indexing search positions optional
About half the size of the Xapian search index turns out to be search
positions. The search positions are only used in a very narrow set of
queries. Make the search positions optional so people don't need to
pay the cost of queries they will never make.
This also makes public-inbox more approachable for light hacking as
generating all of the indexes is time consuming.
The way this is done is to add a method to SearchIdx called index_text
that wraps the call of the term generator method index_text. The new
index_text method takes care of calling both index_text and
increase_termpos (the two functions that are responsible for position
data).
Then index_users, index_diff_inc, index_old_diff_fn, index_diff,
index_body are made proper methods that calls the new index_text.
Callers of the new index_text are slightly simplified as they don't
need to call increase_termpos as well.
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Eric W. Biederman [Wed, 18 Jul 2018 00:32:01 +0000 (19:32 -0500)]
t/v2reindex.t: Swap the order of minmax tests so errors make sense
Previously if a minmax test failed it would say it was expecting the
incorrect value, which is confusing when looking into why the test
fails.
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Eric W. Biederman [Wed, 18 Jul 2018 00:32:00 +0000 (19:32 -0500)]
t/v2reindex.t: Don't reuse $ibx as two different kinds of variable
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Eric W. Biederman [Wed, 18 Jul 2018 00:31:59 +0000 (19:31 -0500)]
t/search.t t/v2writable.t: Teach search tests to fail more cleanly.
Now that some of the indexes are optionals these tests might fail
so teach them to fail more cleanly.
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Eric W. Biederman [Wed, 18 Jul 2018 00:31:58 +0000 (19:31 -0500)]
t/v2reindex.t: Ensure the numbers 1 to 10 are used
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Eric W. Biederman [Tue, 17 Jul 2018 22:06:17 +0000 (17:06 -0500)]
SearchIdx: Decrement regen_down even for added messages that are later deleted.
Decrement regen_down when visiting messages that appear in %D that we
know will later be deleted. This ensures consistent message numbers are
generated no matter which commit number is on top. Allowing deletes to
propagage separately from the messages they delete without causing
problems.
The v2 trees already do this and when the indexes are deleted and
rebuilt they maintain they commit numbers.
Add a v1 version of the v2reindex test to verify that reindexing is
working properly on v1 as well as v2.
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Eric Wong [Thu, 12 Jul 2018 06:35:27 +0000 (06:35 +0000)]
index: avoid false-positive warning on off-by-one
We subtract one from "jobs" to map to "partitions" to account
for the overview index and git fast-import jobs.
Eric Wong [Sat, 14 Jul 2018 00:46:01 +0000 (00:46 +0000)]
v2writable: unindex deleted messages after incremental fetch
The normal behavior is to prevent the deleted messages from
being indexed in the first place. However, when fetching
incrementally via git; public-inbox-index needs to account for
deleted files which were created outside of the most recent
fetch/reindexing window.
Reported-by: Eric W. Biederman <ebiederm@xmission.com>
Eric W. Biederman [Sat, 7 Jul 2018 18:22:28 +0000 (13:22 -0500)]
Import: Don't copy nulls from emails into git
Recently I ran git --git-dir=lkml/git/1.git fsck
and it reported:
> warning in commit
299dbd50b6995c6debe2275f0df984ce697fb4cc: nulInCommit: NULL byte inthe commit object body
Which I found quite scary. Nulls in the wrong place have a bad tendency
to make programs misbehave.
It turns out someone had placed "=?iso-8859-1?q?=00?=" at the end of
their subject line. Which is the mime encoding for NULL. Email::Mime
had correctly decoded the header, and then public-inbox had simply
copied the contents of the header into the subject line of the git
commit.
To prevent that from causing problems replace nulls in such subject
lines with spaces.
Signed-off-by: Eric Biederman <ebiederm@xmission.com>
Eric W. Biederman [Fri, 6 Jul 2018 21:32:15 +0000 (16:32 -0500)]
MsgTime.pm: Use strptime to compute the time zone
Recently I had trouble cloning lkml/git/0.git because
git fsck on receive was failing. The output of git fsck was:
> Checking object directories: 100% (256/256), done.
> warning in commit
59173dc1fe67b113ace4ce83e7f522414b3e0404: badTimezone: invalid author/committer line - bad time zone
> warning in commit
ff22aaff22eb4479e49e93f697e385f76db51c55: badTimezone: invalid author/committer line - bad time zone
> warning in commit
609b744909693f5f00aff5ed9928beeeee9ded2e: badTimezone: invalid author/committer line - bad time zone
> warning in commit
084572141db8e0d879428afb278bd338f2dbb053: badTimezone: invalid author/committer line - bad time zone
> warning in commit
789d204de27cd12c6da693d903390a241a1a4bca: badTimezone: invalid author/committer line - bad time zone
> warning in commit
0d9a65948b0c957007ca387cd56b690f9bab9c08: badTimezone: invalid author/committer line - bad time zone
> warning in commit
f7468c42b4196ee6323afb373ab9323971c38d69: badTimezone: invalid author/committer line - bad time zone
> warning in commit
85e0cd6dd527cd55ad0440f14384529b83818228: badTimezone: invalid author/committer line - bad time zone
> warning in commit
f31e19a2e772c9ed00728ef142af9c550ea5de6a: badTimezone: invalid author/committer line - bad time zone
> warning in commit
56eb7384443ef84e17e29504a304a071b189ae67: badTimezone: invalid author/committer line - bad time zone
> warning in commit
e4470030471e6810414b9de5e3b52e16f2245d12: badTimezone: invalid author/committer line - bad time zone
> warning in commit
f913b48caa097c3b2cb3f491707944f88d52d89f: badTimezone: invalid author/committer line - bad time zone
> warning in commit
4390f26923d572c6dab6cce8282c7cad5520d785: badTimezone: invalid author/committer line - bad time zone
> warning in commit
0f66db71a06bd7d651a0cd80877d8043b70fda20: badTimezone: invalid author/committer line - bad time zone
> warning in commit
d71472c40b36dcdf0396afc9778f6137eea45887: badTimezone: invalid author/committer line - bad time zone
> warning in commit
e8d3b19a91a2d86b6a91bd19dc811e851398b519: badTimezone: invalid author/committer line - bad time zone
> warning in commit
afd9fc0cc87e56ed7736d633e17d0ef77817b3cc: badTimezone: invalid author/committer line - bad time zone
> warning in commit
811b3217708358cf1b75fba4602a64a426fce0f5: badTimezone: invalid author/committer line - bad time zone
> warning in commit
e7a751a597c6f5e4770c61bdee6220d55a37cba9: badTimezone: invalid author/committer line - bad time zone
> warning in commit
3e32ad6192fe093e03e6b9346c3a90b16d9905c0: badTimezone: invalid author/committer line - bad time zone
> warning in commit
5e66b47528e79d3bbb769e137f036a1fa99cccf9: badTimezone: invalid author/committer line - bad time zone
> warning in commit
d90d67d94ca47142670dff13fcb81ab7afab07bb: badTimezone: invalid author/committer line - bad time zone
> Checking objects: 100% (
1711464/
1711464), done.
> Checking connectivity:
1711464, done.
Upon examination with git show --pretty=raw all of the problem commits
had a time zone that was not 4 digits long. This time zone had been
passed straight from the Date line in the email into the author line
of the commit.
Looking into that I discovered that str2time takes into account the
time zone, and was actually able to process these weird time zones.
So get the normalized time zone with strptime and convert it from
seconds from gmt to hours and minutes from gmt.
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Eric Wong [Wed, 4 Jul 2018 10:50:25 +0000 (10:50 +0000)]
v2: fill alternates with old epochs on init from mirrors
For v2 repositories with multiple epochs, we must not forget
about earlier epochs in clones. Ensure we update the alternates
file with all known epochs up to the current one.
Reported-by: Eric W. Biederman <ebiederm@xmission.com>
https://public-inbox.org/meta/871scj2vzi.fsf@xmission.com/
Eric Wong [Tue, 26 Jun 2018 07:46:58 +0000 (07:46 +0000)]
additional tests for bad Message-IDs in URLs
Followup-to: 73cfed86d8a8287a
("www: use undecoded paths for Message-ID extraction")
Reported-by: Leah Neukirchen <leah@vuxu.org>
https://public-inbox.org/meta/8736xsb5s5.fsf@vuxu.org/
Eric Wong [Wed, 13 Jun 2018 22:43:56 +0000 (22:43 +0000)]
www: use undecoded paths for Message-ID extraction
In PSGI, PATH_INFO contains URI-decoded paths which cause
problems when Message-IDs contain ambiguous characters for used
for routing. Instead, extract the undecoded path from
REQUEST_URI and use that.
Reported-by: Leah Neukirchen <leah@vuxu.org>
https://public-inbox.org/meta/8736xsb5s5.fsf@vuxu.org/
Konstantin Ryabitsev [Mon, 18 Jun 2018 17:51:02 +0000 (13:51 -0400)]
Tweak over.sqlite3 queries for sqlite < 3.8
The query planner in sqlite3 < 3.8 is not very clever, so when it sees
num mentioned in the query filter, it decides not to use the fast idx_ts
index and goes for the much slower autoindex. CentOS-7 still has
sqlite-3.7, so loading the http landing page of a very large archive
(LKML) was taking over 18 seconds, as oppposed to milliseconds on a
system with sqlite-3.8 and above:
$ time sqlite3 -line over.sqlite3 'SELECT ts,ds,ddd FROM over \
WHERE num > 0 ORDER BY ts DESC LIMIT 1000;' > /dev/null
real 0m19.610s
user 0m17.805s
sys 0m1.805s
$ sqlite3 -line over.sqlite3 'EXPLAIN QUERY PLAN SELECT ts,ds,ddd \
FROM over WHERE num > 0 ORDER BY ts DESC LIMIT 1000;'
selectid = 0
order = 0
from = 0
detail = SEARCH TABLE over USING INDEX sqlite_autoindex_over_1 (num>?) (~250000 rows)
However, if we slightly tweak the query per SQlite recommendations [1]
by adding + to the num filter, we force it to use the correct index
and see much faster performance:
$ time sqlite3 -line over.sqlite3 'SELECT ts,ds,ddd FROM over \
WHERE +num > 0 ORDER BY ts DESC LIMIT 1000;' > /dev/null
real 0m0.007s
user 0m0.005s
sys 0m0.002s
$ sqlite3 -line over.sqlite3 'EXPLAIN QUERY PLAN SELECT ts,ds,ddd \
FROM over WHERE +num > 0 ORDER BY ts DESC LIMIT 1000;'
selectid = 0
order = 0
from = 0
detail = SCAN TABLE over USING INDEX idx_ts (~
1464303 rows)
This appears to be the only place where this is needed in order to avoid
running into this issue.
As far as I can tell, this change has no impact on systems running newer
sqlite3 (>= 3.8).
.. [1] https://sqlite.org/optoverview.html#disqualifying_where_clause_terms_using_unary_
Signed-off-by: Konstantin Ryabitsev <konstantin@linuxfoundation.org>
Konstantin Ryabitsev [Fri, 15 Jun 2018 19:11:23 +0000 (15:11 -0400)]
Contribute SELinux policy for EL7
This adds a SELinux policy suitable for RHEL/CentOS 7. It assumes the
following:
- public-inbox-httpd and public-inbox-nntpd are running via systemd
on sane ports (119 and 80/8080)
- /var/lib/public-inbox is the location for mainrepos
- /var/run/public-inbox is the location for PERL_INLINE_DIRECTORY
- /var/log/public-inbox is the location for logs
- mail delivery is done via postfix-pipe or public-inbox-watch via
the provided example systemd service
Signed-off-by: Konstantin Ryabitsev <konstantin@linuxfoundation.org>
Eric Wong [Wed, 13 Jun 2018 02:07:59 +0000 (02:07 +0000)]
Makefile.PL: do not depend on git
Otherwise, things do not work from a tarball distribution.
Reported-by: Leah Neukirchen <leah@vuxu.org>
https://public-inbox.org/meta/871sdfzy80.fsf@gmail.com/
Leah Neukirchen [Tue, 12 Jun 2018 15:36:52 +0000 (17:36 +0200)]
public-inbox-mda: use <sysexits.h> status codes where applicable
Many MTA understand these and map them to sensible SMTP error messages.
Inability to find an inbox results in "5.1.1 user unknown".
Misformatted messages are rejected with "5.6.0 data format error".
Unsupported inbox versions are reported as "5.3.5 local configuration error".
All of these are interpreted as permanent failures.
Leah Neukirchen [Tue, 12 Jun 2018 15:22:18 +0000 (17:22 +0200)]
INSTALL: mention Socket6
Eric Wong [Wed, 30 May 2018 20:33:18 +0000 (20:33 +0000)]
examples: add systemd example for public-inbox-watch
I guess I forgot to include this, but I've been running
public-inbox-watch as a systemd service for nearly two
years, now.
Eric Wong [Wed, 30 May 2018 02:54:48 +0000 (02:54 +0000)]
respect umask if core.sharedRepository is not set
This is consistent with git itself and the previous behavior
was a result of misunderstanding of how git interprets this.
And adjust tests slightly to match the new behavior.
Reported-by: Konstantin Ryabitsev <konstantin@linuxfoundation.org>
<
38873789-ab42-65a1-20c9-
12c30b171f4f@linuxfoundation.org>
Eric Wong [Thu, 24 May 2018 08:32:16 +0000 (08:32 +0000)]
workaround Xapian OFD locks w/o close-on-exec
Xapian v1.2.21..v1.2.24 (inclusive) use OFD locks but failed to
set the close-on-exec flag on those locks. So we must continue
to work around those old versions by ensuring Xapian file
descriptors aren't held any longer than necessary when in
long-running git processes.
Reported-by: Konstantin Ryabitsev <konstantin@linuxfoundation.org>
Eric Wong [Wed, 16 May 2018 05:33:32 +0000 (05:33 +0000)]
learn: support for v2 repos
Oops, I mainly rely on public-inbox-watch for spam training
and completely forgot this tool existed :x
Eric Wong [Wed, 16 May 2018 05:33:26 +0000 (05:33 +0000)]
index: avoid setting NPROC to undef
This quiets a warning inside Spawn.pm
Eric Wong [Fri, 11 May 2018 19:20:18 +0000 (19:20 +0000)]
t/search: quiet warning from Encode.pm
This was probably a typo on my part, and quiets a warning:
Argument contains empty address at .../Email/MIME/Encode.pm line 70
Tested with Email::MIME 1.946
Eric Wong [Fri, 11 May 2018 19:20:17 +0000 (19:20 +0000)]
t/v2mda: setup emergency Maildir for test
We can't expect ~/.public-inbox to exist for tests nor should
we be writing to non-temporary directories during tests.
Eric Wong [Fri, 11 May 2018 19:20:16 +0000 (19:20 +0000)]
convert+compact: fix when running without ~/.public-inbox/config
Some users may not have any public-inboxes configured, especially in
tests.
Eric Wong [Fri, 11 May 2018 19:20:15 +0000 (19:20 +0000)]
content_id: workaround quote handling change in Email::* modules
I'm not entirely sure where the behavior change lies, but
it seems to be in some of the latest CPAN versions of these
modules. In any case, this only affects the test setup and
not actual behavior.
cf. https://public-inbox.org/meta/
2a2bf0e1-fd1f-f8bf-95bc-
dac47906ef43@linuxfoundation.org/
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!
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.
Eric Wong [Wed, 2 May 2018 20:54:35 +0000 (20:54 +0000)]
scripts/import_slrnspool: support v2 repos
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.
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.
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")
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"
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: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.
Eric Wong [Fri, 20 Apr 2018 10:27:21 +0000 (10:27 +0000)]
TODO: add EPOLLEXCLUSIVE item
Threads are generally discouraged in Perl5, so I won't be using
a dedicated blocking accept4() thread like I would in other
languages.
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.
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: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")
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 [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:
https://public-inbox.org/git/
656C30A1EFC89F6B2082D9B6@localhost/raw
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
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:
https://public-inbox.org/meta/
20180307093754.GA27748@dcvr/
Eric Wong [Thu, 19 Apr 2018 19:43:59 +0000 (19:43 +0000)]
TODO: a few more updates
Mainly, v2 stuff is done
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.
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.
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 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.
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.
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)
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.
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: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)
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: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.
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) [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.
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...
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")
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:52 +0000 (03:41 +0000)]
convert: support converting with altid defined
public-inbox-convert ought to be 100% lossless, now
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.
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
\---------->/
\-------->/
After:
/---------->
/----------->
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
dominates.
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.
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.
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.
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) [Fri, 6 Apr 2018 21:44:37 +0000 (21:44 +0000)]
nntp: set Xref across multiple inboxes
Noted by Jonathan Corbet in https://lwn.net/Articles/748184/
Eric Wong (Contractor, The Linux Foundation) [Fri, 6 Apr 2018 21:44:36 +0000 (21:44 +0000)]
altid: fix miscopied field name
Oops :x
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.
https://public-inbox.org/git/nycvar.QRO.7.76.6.
1804041821420.55@ZVAVAG-6OXH6DA.rhebcr.pbec.zvpebfbsg.pbz
https://public-inbox.org/git/alpine.DEB.2.20.
1702041206130.3496@virtualbox/
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.
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.
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.
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.