]> Sergey Matveev's repositories - public-inbox.git/log
public-inbox.git
5 years agoMerge commit 'mem'
Eric Wong [Thu, 10 Jan 2019 21:41:55 +0000 (21:41 +0000)]
Merge commit 'mem'

* commit 'mem':
  view: more culling for search threads
  over: cull unneeded fields for get_thread
  searchmsg: remove unused fields for PSGI in Xapian results
  searchview: drop unused {seen} hashref
  searchmsg: remove Xapian::Document field
  searchmsg: get rid of termlist scanning for mid
  httpd: remove psgix.harakiri reference

5 years agot/v2writable.t: force more consistent "git log" output
Eric Wong [Thu, 10 Jan 2019 03:26:15 +0000 (03:26 +0000)]
t/v2writable.t: force more consistent "git log" output

This should probably use lower-level git plumbing, but until
then, consistently add a bunch of --no-* options to "git log"
to get more consistent output.

Noticed-by: Johannes Berg
  https://public-inbox.org/meta/1538164205.14416.76.camel@sipsolutions.net/

5 years agocheck git version requirements
Eric Wong [Thu, 10 Jan 2019 04:53:10 +0000 (04:53 +0000)]
check git version requirements

This allows v1 tests to continue working on git 1.8.0 for
now.  This allows git 2.1.4 packaged with Debian 8 ("jessie")
to run old tests, at least.

I suppose it's safe to drop Debian 7 ("wheezy") due to our
dependency on git 1.8.0 for "merge-base --is-ancestor".

Writing V2 repositories requires git 2.6 for "get-mark"
support, so mask out tests for older gits.

5 years agoINSTALL: Net::Server is not needed for systemd use
Eric Wong [Thu, 10 Jan 2019 03:42:16 +0000 (03:42 +0000)]
INSTALL: Net::Server is not needed for systemd use

Also, move Socket6 down since it's usually pulled in as
a dependency of Net::Server or SpamAssassin; and we can
fail gracefully without it.

5 years agodaemon: make Socket6 optional, note about Net::Socket::IP
Eric Wong [Thu, 10 Jan 2019 04:02:59 +0000 (04:02 +0000)]
daemon: make Socket6 optional, note about Net::Socket::IP

It looks like Net::Socket::IP comes with Perl 5.20 and
later; so we won't have to hassle users with another
package to install.

5 years agodoc: various overview-level module comments
Eric Wong [Mon, 7 Jan 2019 09:09:51 +0000 (09:09 +0000)]
doc: various overview-level module comments

Hopefully this helps people familiarize themselves with
the source code.

5 years agoINSTALL: fix Date::Parse dependency for Debian
Eric Wong [Wed, 9 Jan 2019 11:44:07 +0000 (11:44 +0000)]
INSTALL: fix Date::Parse dependency for Debian

So yes, both "libdatetime-perl" and "libtimedate-perl" exist
in Debian.  We want the latter for the Date::Parse module.

(And the former pulls in THIRTY-SEVEN dependencies on a fresh
 sid chroot, ohg yrsgcnq vf abg bar bs gurz).

5 years agoview: more culling for search threads
Eric Wong [Tue, 8 Jan 2019 11:19:57 +0000 (11:19 +0000)]
view: more culling for search threads

{mapping} overhead is now down to ~1.3M at the end of
a giant thread from hell.

5 years agoover: cull unneeded fields for get_thread
Eric Wong [Tue, 8 Jan 2019 11:13:33 +0000 (11:13 +0000)]
over: cull unneeded fields for get_thread

On a certain ugly /$INBOX/$MESSAGE_ID/T/ endpoint with 1000
messages in the thread, this cuts memory usage from 2.5M to 1.9M
(which still isn't great, but it's a start).

5 years agosearchmsg: remove unused fields for PSGI in Xapian results
Eric Wong [Tue, 8 Jan 2019 11:13:31 +0000 (11:13 +0000)]
searchmsg: remove unused fields for PSGI in Xapian results

These fields are only necessary in NNTP and not even stored in
Xapian; so keeping them around for the PSGI web UI search
results wastes nearly 80K when loading large result sets.

5 years agosearchview: drop unused {seen} hashref
Eric Wong [Tue, 8 Jan 2019 11:13:30 +0000 (11:13 +0000)]
searchview: drop unused {seen} hashref

Unused since commit 5f09452bb7e6cf49fb6eb7e6cf166a7c3cdc5433
("view: cull redundant phrases in subjects")

5 years agosearchmsg: remove Xapian::Document field
Eric Wong [Tue, 8 Jan 2019 11:13:29 +0000 (11:13 +0000)]
searchmsg: remove Xapian::Document field

We don't need to be carrying this around with the many SearchMsg
objects we have.  This saves about 20K from a large SearchView
"&x=t" response.

5 years agosearchmsg: get rid of termlist scanning for mid
Eric Wong [Tue, 8 Jan 2019 11:13:27 +0000 (11:13 +0000)]
searchmsg: get rid of termlist scanning for mid

It doesn't seem to be used anywhere

5 years agohttpd: remove psgix.harakiri reference
Eric Wong [Tue, 8 Jan 2019 11:13:26 +0000 (11:13 +0000)]
httpd: remove psgix.harakiri reference

We don't need to set "psgix." extension fields for things
we don't support.  This saves 138 bytes per-client in $env
as measured by Devel::Size::total_size

5 years agoview: fix wrong date for non-Xapian/SQLite v1 users
Eric Wong [Tue, 8 Jan 2019 10:30:42 +0000 (10:30 +0000)]
view: fix wrong date for non-Xapian/SQLite v1 users

We need to parse the MIME object in order to get the
datestamp for those sites.

Fixes: 7d02b9e64455 ("view: stop storing all MIME objects on large threads")
5 years agonntp: fix uninitialized variable in event_read
Eric Wong [Mon, 7 Jan 2019 11:53:10 +0000 (11:53 +0000)]
nntp: fix uninitialized variable in event_read

do_write must return 0 or 1.

5 years agoview: stop storing all MIME objects on large threads
Eric Wong [Tue, 8 Jan 2019 00:41:12 +0000 (00:41 +0000)]
view: stop storing all MIME objects on large threads

While we try to discard the $smsg (SearchMsg) objects quickly,
they remain referenced via $node (SearchThread::Msg) objects,
which are stored forever in $ctx->{mapping} to cull redundant
words out of subjects in the thread skeleton.

This significantly cuts memory bloat with large search results
with '&x=t'.  Now, the search results overhead of
SearchThread::Msg and linked objects are stable at around 350K
instead of ~7M per response in a rough test (there's more
savings to be had in the same areas).

Several hundred kilobytes is still huge and a large per-client
cost; but it's far better than MEGABYTES per-client.

5 years agot/mda_filter_rubylang.t: set PI_EMERGENCY for -mda
Eric Wong [Mon, 7 Jan 2019 05:22:41 +0000 (05:22 +0000)]
t/mda_filter_rubylang.t: set PI_EMERGENCY for -mda

Tests should not write to the default ~/.public-inbox/emergency

5 years agoshrink low-bandwidth pipes under Linux
Eric Wong [Sat, 5 Jan 2019 21:52:57 +0000 (21:52 +0000)]
shrink low-bandwidth pipes under Linux

I've hit /proc/sys/fs/pipe-user-pages-* limits on some systems.
So stop hogging resources on pipes which don't benefit from
giant sizes.

Some of these can use eventfd in the future to further reduce
resource use.

5 years agoindex: quiet down git-log error messages on new inboxes
Eric Wong [Sat, 5 Jan 2019 11:00:52 +0000 (11:00 +0000)]
index: quiet down git-log error messages on new inboxes

The new t/*filter_rubylang.t tests call -index immediately
after -init, which causes confusing messages to show up to
the end user.

Check the validity of the ref before calling "git-log".

5 years agofilter/rubylang: fix SQLite DB lifetime problems
Eric Wong [Sat, 5 Jan 2019 10:41:15 +0000 (10:41 +0000)]
filter/rubylang: fix SQLite DB lifetime problems

Clearly the AltId stuff was never tested for v2.  Ensure
this tricky filter (which reuses Msgmap to avoid introducing
new serial numbers) doesn't trigger deadlocks SQLite due
to opening a DB for writing multiple times.

I went through several iterations of this change before
going with this one, which is the least intrusive I could
fine.

5 years agoinboxwritable: drop unused variable
Eric Wong [Sat, 5 Jan 2019 09:22:07 +0000 (09:22 +0000)]
inboxwritable: drop unused variable

5 years agowatchmaildir: normalize Maildir pathnames consistently
Eric Wong [Sat, 5 Jan 2019 02:33:05 +0000 (02:33 +0000)]
watchmaildir: normalize Maildir pathnames consistently

Remove redundant slashes while we're at it.

5 years agowatchmaildir: get rid of unused spamdir field
Eric Wong [Sat, 5 Jan 2019 02:05:42 +0000 (02:05 +0000)]
watchmaildir: get rid of unused spamdir field

Unused since commit 6c2caa791bd5fbf5c4edb1a4a2c1807e527348a7
("watchmaildir: support v2 repositories")

5 years agowatchmaildir: support multiple inboxes in the same Maildir
Eric Wong [Sat, 5 Jan 2019 00:35:42 +0000 (00:35 +0000)]
watchmaildir: support multiple inboxes in the same Maildir

Not sure what I was smoking when I originally wrote this code.

cf. https://public-inbox.org/meta/874li887mp.fsf@vuxu.org/

5 years agot/cgi.t: remove more redundant tests
Eric Wong [Fri, 4 Jan 2019 11:53:02 +0000 (11:53 +0000)]
t/cgi.t: remove more redundant tests

Most of these test cases are in t/plack.t, already; and that
runs much faster.  Just ensure the slashy corner case and search
stuff works.  While we're at it, avoid using the
public-inbox-index command and just use the internal API to
index.

5 years agot/cgi.t: move expected failure tests to t/plack.t
Eric Wong [Fri, 4 Jan 2019 11:32:00 +0000 (11:32 +0000)]
t/cgi.t: move expected failure tests to t/plack.t

No point in implementing these slowly with the CGI wrapper
when PSGI is sufficient for testing.

5 years agot/cgi.t: move dumb HTTP git clone/fetch tests to plack.t
Eric Wong [Fri, 4 Jan 2019 09:14:48 +0000 (09:14 +0000)]
t/cgi.t: move dumb HTTP git clone/fetch tests to plack.t

No need to test this via CGI .cgi is a wrapper around
PSGI and PSGI tests are way faster.

5 years agot/cgi.t: remove atom.xml test
Eric Wong [Fri, 4 Jan 2019 09:02:51 +0000 (09:02 +0000)]
t/cgi.t: remove atom.xml test

It is redundant with what is in t/plack.t

5 years agot/cgi.t: remove redundant redirect check
Eric Wong [Fri, 4 Jan 2019 08:55:04 +0000 (08:55 +0000)]
t/cgi.t: remove redundant redirect check

t/plack.t already has the same test.

5 years agot/cgi.t: eliminate some cruft and unnecessary tests
Eric Wong [Fri, 4 Jan 2019 08:51:20 +0000 (08:51 +0000)]
t/cgi.t: eliminate some cruft and unnecessary tests

More of this test will be, we use PSGI nowadays; and
most of these tests can be ported over to use PSGI and
not fork+exec as much.

5 years agov2writable: disable parallelism on indexlevel=basic
Eric Wong [Tue, 1 Jan 2019 11:50:25 +0000 (11:50 +0000)]
v2writable: disable parallelism on indexlevel=basic

There is no need for parallelism if we're not using Xapian.

5 years agoconfig: relax name inbox name restrictions
Eric Wong [Tue, 1 Jan 2019 10:18:47 +0000 (10:18 +0000)]
config: relax name inbox name restrictions

Since "publicinbox" sections are analogous to git remotes, we
may use the same rules for naming git remotes to reduce
cognitive overhead.

Most notably, this allows '.' in the middle of inbox names,
(e.g. "foo.bar") as it's common for email addresses, too.

5 years agouse PublicInbox::Config::each_inbox where appropriate
Eric Wong [Tue, 1 Jan 2019 10:18:46 +0000 (10:18 +0000)]
use PublicInbox::Config::each_inbox where appropriate

No need to reach into PublicInbox::Config internals and iterate
through the hashref by hand

5 years agoupdate and add documentation for repository formats
Eric Wong [Wed, 2 Jan 2019 08:23:13 +0000 (08:23 +0000)]
update and add documentation for repository formats

Remove confusing documentation around ssoma now that we
have NNTP and downloadable mbox support.

Only lightly-checked for grammar and speling, and not yet
formatting.  Edits, corrections and addendums expected :>

5 years agot/feed.t: remove ssoma use
Eric Wong [Mon, 31 Dec 2018 22:00:22 +0000 (22:00 +0000)]
t/feed.t: remove ssoma use

No need to waste cycles with this anymore.

5 years agot/v2reindex: use the larger text to increase test reliability
Eric Wong [Wed, 2 Jan 2019 00:50:55 +0000 (00:50 +0000)]
t/v2reindex: use the larger text to increase test reliability

libxapian30:amd64 1.4.9-1 on Debian sid seems to give an 8KB
position.glass database with "hello world" as the document
regardless of our indexlevel.  Use the text of the AGPL-3.0 for
a more realisitic Xapian database size.

And perhaps tying our tests to the AGPL will make life more
difficult for would-be copyright violators :>

5 years agoINSTALL: note Plack and URI::Escape are required at the moment
Eric Wong [Wed, 2 Jan 2019 00:50:54 +0000 (00:50 +0000)]
INSTALL: note Plack and URI::Escape are required at the moment

They really shouldn't be...  Also, it seems like eliminating IPC::Run
is not going to be worth the effort.

5 years agoinbox: keep Danga::Socket optional
Eric Wong [Wed, 2 Jan 2019 00:50:53 +0000 (00:50 +0000)]
inbox: keep Danga::Socket optional

We can't run cleanup stuff without Danga::Socket.

5 years agohval: set font-size:100% for all elements
Eric Wong [Tue, 1 Jan 2019 07:45:38 +0000 (07:45 +0000)]
hval: set font-size:100% for all elements

GUI browsers have a tendency to use a larger (though sometimes
smaller) font than the rest of the page for some reason I could
not find...

So set everything to 100% to give uniformity to the page; which
benefits visually-challenged users who want to use gigantic
fonts for the entire page.

5 years agoTODO: avoid mentioning untrustworthy browser extensions
Eric Wong [Tue, 1 Jan 2019 06:49:00 +0000 (06:49 +0000)]
TODO: avoid mentioning untrustworthy browser extensions

Old and new versions of Mozilla-based browsers seem to support
userContent.css just fine.

cf. https://www-archive.mozilla.org/unix/customizing.html#usercss
    http://kb.mozillazine.org/index.php?title=UserContent.css

5 years agoTODO: support integration with cgit/gitweb/etc...
Eric Wong [Sun, 30 Dec 2018 02:45:24 +0000 (02:45 +0000)]
TODO: support integration with cgit/gitweb/etc...

We support searching on blob identifiers for a reason :>

5 years agoTODO: add a note for exposing a targeted reindexing API
Eric Wong [Sun, 30 Dec 2018 12:41:31 +0000 (12:41 +0000)]
TODO: add a note for exposing a targeted reindexing API

5 years agohandle "multipart/mixed" messages which are not multipart
Eric Wong [Sun, 30 Dec 2018 12:41:25 +0000 (12:41 +0000)]
handle "multipart/mixed" messages which are not multipart

I've found two examples on https://lore.kernel.org/lkml/
where the messages declared themselves to be "multipart/mixed"
but were actually plain text:

<87llgalspt.fsf@free.fr>
<200308111450.h7BEoOu20077@mail.osdl.org>

With the mboxrd downloaded, mutt is able to view them without
difficulty.

Note: this change would require reindexing of Xapian to pick up
the changes.  But it's only two ancient messages, the first was
resent by the original sender and the second is too old to be
relevant.

5 years agoexamples/cgit-commit-filter.lua: escape '&' properly in URL
Eric Wong [Sun, 30 Dec 2018 20:10:40 +0000 (20:10 +0000)]
examples/cgit-commit-filter.lua: escape '&' properly in URL

5 years agot/git.t: reorder IPC::Run check
Eric Wong [Sat, 29 Dec 2018 05:51:14 +0000 (05:51 +0000)]
t/git.t: reorder IPC::Run check

We can't skip tests after "use_ok"

5 years agot/cgi.t: shorten %ENV setting
Eric Wong [Fri, 28 Dec 2018 06:26:05 +0000 (06:26 +0000)]
t/cgi.t: shorten %ENV setting

No need to write our own loop when an assignment will do.

5 years agotests: consolidate process spawning code.
Eric Wong [Wed, 26 Dec 2018 09:07:49 +0000 (09:07 +0000)]
tests: consolidate process spawning code.

IPC::Run provides a nice simplification in several places; and
we already use it (optionally) on a lot of tests.

For the non-test code, we still rely on our vfork-capable
Inline::C stuff since real-world server processes can get large
enough to where vfork is an advantage.  Maybe Perl5 can use
CLONE_VFORK somehow, one day:

  https://rt.perl.org/Ticket/Display.html?id=128227

Ohg V'q engure cbeg choyvp-vaobk gb Ehol :C

5 years agoexamples/cgit-commit-filter.lua: update URLs
Eric Wong [Fri, 28 Dec 2018 06:22:55 +0000 (06:22 +0000)]
examples/cgit-commit-filter.lua: update URLs

Let's Encrypt is working out nicely, so we can rely on HTTPS,
now.  Use 80x24.org instead of bogomips.org while we're at it,
since I don't think the latter will remain.

5 years agoTODO: add note for "IMAP IDLE"-like long-polling "git fetch"
Eric Wong [Sat, 29 Dec 2018 03:43:42 +0000 (03:43 +0000)]
TODO: add note for "IMAP IDLE"-like long-polling "git fetch"

5 years agowwwstream: always show multi-line cloning instructions
Eric Wong [Fri, 28 Dec 2018 20:38:59 +0000 (20:38 +0000)]
wwwstream: always show multi-line cloning instructions

Unfortunately, long inbox names and URLs don't really display well
with my gigantic fonts...

5 years agoadd filter for gmane archives
Eric Wong [Fri, 28 Dec 2018 19:17:36 +0000 (19:17 +0000)]
add filter for gmane archives

Extracted from import_slrnspool, since some spools get converted
to mbox or what not.

5 years agoinit: allow --skip of old epochs for -V2 repos
Eric Wong [Fri, 28 Dec 2018 10:16:11 +0000 (10:16 +0000)]
init: allow --skip of old epochs for -V2 repos

This allows archivists to publish incomplete archives with newer
mail while allowing "0.git" (or "1.git" and so on) epochs to be
added-after-the-fact (without affecting "git clone" followers).

A reindex will be necessary for Xapian and SQLite to catch up
once the old epochs are added; but the reindexing code is also
capable of tolerating missing epochs.

5 years agoreply: allow ":none=$REASON" in "replyto" config
Eric Wong [Fri, 28 Dec 2018 00:22:12 +0000 (00:22 +0000)]
reply: allow ":none=$REASON" in "replyto" config

This can be useful for configuring archives of lists which are
no longer active.

5 years agot/git-http-backend.t: remove TEST_CHUNK env setting
Eric Wong [Tue, 25 Dec 2018 11:14:13 +0000 (11:14 +0000)]
t/git-http-backend.t: remove TEST_CHUNK env setting

TEST_CHUNK hast not been relevant since 2016:
(commit bb38f0fcce73904e "http: chunk in the server, not middleware")

5 years agot/perf-nntpd.t: update for RFC 5536 sec 3.2.14 compliance
Eric Wong [Tue, 25 Dec 2018 11:12:04 +0000 (11:12 +0000)]
t/perf-nntpd.t: update for RFC 5536 sec 3.2.14 compliance

This performance test doesn't normally get run...

Fixes: dd7049951c052c54 ("Put the NNTP server name into Xref lines")
5 years agoinit: do not set publicinbox.$NAME.indexlevel by default
Eric Wong [Tue, 25 Dec 2018 03:44:57 +0000 (03:44 +0000)]
init: do not set publicinbox.$NAME.indexlevel by default

It is redundant to set default values in the public-inbox
config file.  Lets not clutter up users' screens when they
view or edit the config file.

5 years agoTODO: add a note for davfs2 Range: support
Eric Wong [Tue, 18 Dec 2018 06:43:53 +0000 (06:43 +0000)]
TODO: add a note for davfs2 Range: support

And maybe I or somebody else interested will implement it, since
fusedav is abandoned upstream and removed from Debian testing:

  https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=840388

Yes, I have fusedav patches at https://bogomips.org/fusedav.git
as noted in the above bug report, but I think davfs2 has more
momentum at the moment.

5 years agodoc/hosted: add glibc and bug-gnulib mirrors
Eric Wong [Wed, 12 Dec 2018 23:18:13 +0000 (23:18 +0000)]
doc/hosted: add glibc and bug-gnulib mirrors

These have existed for a while, actually, so, we might as well
publicize them.  While we're at it, add a disclaimer to
discourage reliance on single points of failure.

5 years agonntp: prevent event_read from firing twice in a row
Eric Wong [Thu, 6 Dec 2018 02:40:06 +0000 (02:40 +0000)]
nntp: prevent event_read from firing twice in a row

When a client starts pipelining requests to us which trigger
long responses, we need to keep socket readiness checks disabled
and only enable them when our socket rbuf is drained.

Failure to do this caused aborted clients with
"BUG: nested long response" when Danga::Socket calls event_read
for read-readiness after our "next_tick" sub fires in the
same event loop iteration.

Reported-by: Jonathan Corbet <corbet@lwn.net>
cf. https://public-inbox.org/meta/20181013124658.23b9f9d2@lwn.net/

5 years agoAdd Xrefs to over/xover lines
Jonathan Corbet [Sat, 13 Oct 2018 21:42:21 +0000 (15:42 -0600)]
Add Xrefs to over/xover lines

Putting the Xref field into xover lines allows newsreaders to mark
cross-posted messages read when catching up a group.  That, in turn,
massively improves the life of crazy people who try to follow dozens of
kernel lists, where emails are often heavily cross-posted.

5 years agoPut the NNTP server name into Xref lines
Jonathan Corbet [Sat, 13 Oct 2018 21:42:20 +0000 (15:42 -0600)]
Put the NNTP server name into Xref lines

RFC 5536 sec 3.2.14 says that the server-name in an Xref line is "which
news server generated the header field"; indeed, that is necessary for
newsreaders like gnus to handle references properly.  So pick up the server
name from the config if available (the first name if there's more than
one), from the host name otherwise, and use it rather than the domain
name of the list server.

Tests have been adjusted to match the new behavior.

5 years agoImport.pm: When purging replace a purged file with a zero length file
Eric W. Biederman [Fri, 10 Aug 2018 00:08:22 +0000 (19:08 -0500)]
Import.pm: When purging replace a purged file with a zero length file

This ensures that the number of added files remains the same and thus
the article numbers derived from a repository will remain the same.

I think this is the last place in public-inbox that has to be tweaked to
guarantee the generated article number will remain the same in an public
inbox archive.

Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
5 years agooveridx: preserve `tid' column on re-indexing
Eric Wong [Sun, 5 Aug 2018 08:19:25 +0000 (08:19 +0000)]
overidx: preserve `tid' column on re-indexing

Otherwise, walking backwards through history could mean the root
message in a thread forgets its `tid' and it prevents messages
from being looked up by it.

This bug was hidden by the fact that `sid' matches were often
good enough to link threads together.

5 years agoview: distinguish strict and loose thread matches
Eric Wong [Sun, 5 Aug 2018 06:04:40 +0000 (06:04 +0000)]
view: distinguish strict and loose thread matches

The "loose" (Subject:-based) thread matching yields too many
hits for some common subjects (e.g. "[GIT] Networking" on LKML)
and causes thread skeletons to not show the current messages.
Favor strict matches in the query and only add loose matches
if there's space.

While working on this, I noticed the backwards --reindex walk
breaks `tid' on v1 repositories, at least.  That bug was hidden
by the Subject: match logic and not discovered until now.  It
will be fixed separately.

Reported-by: Konstantin Ryabitsev <konstantin@linuxfoundation.org>
5 years agoMerge branch 'eb/index-incremental'
Eric Wong [Fri, 3 Aug 2018 20:05:24 +0000 (20:05 +0000)]
Merge branch 'eb/index-incremental'

Incremental indexing fixes from Eric W. Biederman.

These prevents the highest message number in msgmap from
being reassigned after deletes in rare cases and ensures
messages are deleted from msgmap in v2.

* eb/index-incremental:
  V2Writeable.pm: In unindex_oid delete the message from msgmap
  V2Writeable.pm: Ensure that a found message number is in the msgmap
  SearchIdx,V2Writeable: Update num_highwater on optimized deletes
  t/v[12]reindex.t: Verify the num highwater is as expected
  t/v[12]reindex.t Verify num_highwater
  Msgmap.pm: Track the largest value of num ever assigned
  SearchIdx.pm: Always assign numbers backwards during incremental indexing
  t/v[12]reindex.t: Test incremental indexing works
  t/v[12]reindex.t: Test that the resulting msgmap is as expected
  t/v[12]reindex.t: Place expected second in Xapian tests
  t/v2reindex.t: Isolate the test cases more
  t/v1reindex.t: Isolate the test cases
  Import.pm: Don't assume {in} and {out} always exist

5 years agoV2Writeable.pm: In unindex_oid delete the message from msgmap
Eric W. Biederman [Wed, 1 Aug 2018 16:43:44 +0000 (11:43 -0500)]
V2Writeable.pm: In unindex_oid delete the message from msgmap

Now that we track the num highwater mark it is safe to remove messages
from msgmap that have been previously allocated.  Removing even the
highest numbered article will no longer cause new message numbers to
move backwards.

Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
5 years agoV2Writeable.pm: Ensure that a found message number is in the msgmap
Eric W. Biederman [Wed, 1 Aug 2018 16:43:43 +0000 (11:43 -0500)]
V2Writeable.pm: Ensure that a found message number is in the msgmap

The lookup to see if a num has already been assigned to a message
happens in a temporary copy of message map.  It is possible that the
number has been removed from the current message map.  The
unindex/reindex after a history rewrite triggered by a purge should be
one such case.  Therefore add the number to the msgmap in case it is
not currently present.

Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
5 years agoSearchIdx,V2Writeable: Update num_highwater on optimized deletes
Eric W. Biederman [Wed, 1 Aug 2018 16:43:42 +0000 (11:43 -0500)]
SearchIdx,V2Writeable: Update num_highwater on optimized deletes

When performing an incremental index update with index_sync if a message is seen
to be both added and deleted update the num_highwater mark even though the
message is not otherwise indexed.

This ensures index_sync generates the same msgmap no matter which commit
it stops at during incremental syncs.

Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
5 years agot/v[12]reindex.t: Verify the num highwater is as expected
Eric W. Biederman [Wed, 1 Aug 2018 16:43:41 +0000 (11:43 -0500)]
t/v[12]reindex.t: Verify the num highwater is as expected

Instrument the tests to verify the highwater num highwater mark is
where it is expected.

Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
5 years agot/v[12]reindex.t Verify num_highwater
Eric W. Biederman [Wed, 1 Aug 2018 16:43:40 +0000 (11:43 -0500)]
t/v[12]reindex.t Verify num_highwater

Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
5 years agoMsgmap.pm: Track the largest value of num ever assigned
Eric W. Biederman [Wed, 1 Aug 2018 16:43:39 +0000 (11:43 -0500)]
Msgmap.pm: Track the largest value of num ever assigned

Today the only thing that prevents public-inbox not reusing the
message numbers of deleted messages is the sqlite autoincrement magic
and that only works part of the time.  The new incremental indexing
test has revealed areas where today public-inbox does try to reuse
numbers of deleted messages.

Reusing the message numbers of existing messages is a problem because
if a client ever sees messages that are subsequently deleted the
client will not see the new messages with their old numbers.

In practice this is difficult to trigger because it requires the most
recently added message to be removed and have the removal show up in a
separate pull request.  Still it can happen and it should be handled.

Instead of infering the highset number ever used by finding the maximum
number in the message map, track the largest number ever assigned directly.

Update Msgmap to track this value and update the indexers to use this
value.

Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
5 years agosearch: (really) match the behavior of WWW for indexing text
Eric Wong [Mon, 30 Jul 2018 08:23:51 +0000 (08:23 +0000)]
search: (really) match the behavior of WWW for indexing text

Not sure what was going through my mind when I made my first
attempt at this, but we really want to make sure we index all
the text we display in the web view (and presumably anything a
reasonable mail client can display).

Followup-to: 0cf6196025d4e4880cd1ed859257ce21dd3cdcf6
    ("search: match the behavior of WWW for indexing text")

5 years agoSearchIdx.pm: Always assign numbers backwards during incremental indexing
Eric W. Biederman [Wed, 1 Aug 2018 16:43:38 +0000 (11:43 -0500)]
SearchIdx.pm: Always assign numbers backwards during incremental indexing

When walking messages newest to oldest, assigning the larger numbers
before smaller numbers ensures older messages get smaller numbers.
This leads to the possibility of a msgmap that can be regenerated when
needed.

Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
5 years agot/v[12]reindex.t: Test incremental indexing works
Eric W. Biederman [Wed, 1 Aug 2018 16:43:37 +0000 (11:43 -0500)]
t/v[12]reindex.t: Test incremental indexing works

Capture interesting commits of the test repository in mark variables.

Use those marks to build interesting scenarios where index_sync proceeds
as if those marks are the heads of the repositor.  Use this capability to
test what happens when adds and deletes are mixed within a repository.

Be sad because things don't yet work as they should.

Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
5 years agot/v[12]reindex.t: Test that the resulting msgmap is as expected
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>
5 years agot/v[12]reindex.t: Place expected second in Xapian tests
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>
5 years agot/v2reindex.t: Isolate the test cases more
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>
5 years agot/v1reindex.t: Isolate the test cases
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>
5 years agoImport.pm: Don't assume {in} and {out} always exist
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>
5 years agoProcessPipe.pm: Use read not sysread
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>
5 years agomda: allow configuring globally without spamc support
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.

5 years agomda: v2: ensure message bodies are indexed
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

5 years agot/v2mda: make it easy to test v1 repos here, too
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.

5 years agomda: use InboxWritable
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.

5 years agosearch: use boolean prefixes for git blob queries
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.

5 years agov1: allow upgrading indexlevel=basic to 'medium' or 'full'
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.

5 years agotests: fixup indexlevel setting in tests
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.

5 years agoImport.pm: Deal with potentially missing From and Sender headers
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>
5 years agosearchidx: respect XAPIAN_FLUSH_THRESHOLD env if set
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.

5 years agopublic-inbox-init: Initialize indexlevel
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>
5 years agoSearchIdx: Allow the amount of indexing be configured
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>
5 years agoSearchIdx: Add the mechanism for making all Xapian indexing optional
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>
5 years agoSearchIdx.pm: Make indexing search positions optional
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>
5 years agot/v2reindex.t: Swap the order of minmax tests so errors make sense
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>
5 years agot/v2reindex.t: Don't reuse $ibx as two different kinds of variable
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>
5 years agot/search.t t/v2writable.t: Teach search tests to fail more cleanly.
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>
5 years agot/v2reindex.t: Ensure the numbers 1 to 10 are used
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>
5 years agoSearchIdx: Decrement regen_down even for added messages that are later deleted.
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>
5 years agoindex: avoid false-positive warning on off-by-one
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.