]> Sergey Matveev's repositories - public-inbox.git/log
public-inbox.git
2 years agolei: close inotify FD in forked child
Eric Wong [Thu, 29 Jul 2021 10:01:31 +0000 (10:01 +0000)]
lei: close inotify FD in forked child

Linux::Inotify2 2.3+ includes an ->fh method to give us the
ability to safely close an FD without hitting EBADF (and
automatically use FD_CLOEXEC).

We'll still need a new wrapper class (LI2Wrap) to handle it for
users of old versions, though.

Link: http://lists.schmorp.de/pipermail/perl/2021q3/thread.html
2 years agoextindex: -xcpdb and -compact support
Eric Wong [Fri, 30 Jul 2021 12:18:55 +0000 (12:18 +0000)]
extindex: -xcpdb and -compact support

Since extindex uses Xapian shards in a similar way to
v2 inboxes, we'll support -xcpdb (reshard+upgrade) and
-compact all the same to give admins tuning+upgrade
options.

2 years agoadmin: index_inbox: drop unnecessary check
Eric Wong [Fri, 30 Jul 2021 12:18:54 +0000 (12:18 +0000)]
admin: index_inbox: drop unnecessary check

No callers pass an unblessed pathname to index_inbox,
only Inbox object refs.

2 years agolistener: maximize listen(2) backlog
Eric Wong [Wed, 28 Jul 2021 00:37:19 +0000 (00:37 +0000)]
listener: maximize listen(2) backlog

This helps avoid errors from script/lei dying on ECONNRESET
when a single lei-daemon is serving all tests when run via
"make check-run".

Instead of using some arbitrary limit, use INT_MAX and let
the kernel clamp it (both Linux and FreeBSD do).

There's no need to call listen() in LEI.pm, either, since
Listener->new takes care of it.

2 years agolei: die on ECONNRESET
Eric Wong [Wed, 28 Jul 2021 00:37:18 +0000 (00:37 +0000)]
lei: die on ECONNRESET

ECONNRESET should be rare on a private local socket, and if
we hit it, it's because we're hitting the listen() limit.

2 years agotreewide: s/sequential_shard/sequential-shard/g
Eric Wong [Tue, 27 Jul 2021 10:44:29 +0000 (10:44 +0000)]
treewide: s/sequential_shard/sequential-shard/g

The underscore variant was never documented and maintaining
the difference between the command-line and internal hash
is not worth it.

2 years agoextindex: support --jobs/-j properly on creation for shard count
Eric Wong [Sun, 25 Jul 2021 12:44:23 +0000 (12:44 +0000)]
extindex: support --jobs/-j properly on creation for shard count

This wasn't wired up properly, but Xapian appears to suffer from
I/O amplification problems as DB shards get larger:

  https://lists.xapian.org/pipermail/xapian-discuss/2019-February/009727.html
  <23640.32170.703368.841021@y.dockes.com>

Of course, we shouldn't have too many shards, either; because
performance problems with too many shards was the entire reason
extindex was created:

  https://lists.xapian.org/pipermail/xapian-discuss/2020-August/009823.html
  <20200826064728.GA32239@dcvr>

2 years agodoc: lei-{p2q,rediff}: note implicit --stdin
Eric Wong [Sun, 25 Jul 2021 12:03:33 +0000 (12:03 +0000)]
doc: lei-{p2q,rediff}: note implicit --stdin

lei actually uses implicit --stdin everywhere, but I thing
these patch-related commands are the most common use of them.

2 years agot/lei-watch.t: improve test reliability
Eric Wong [Sun, 25 Jul 2021 11:15:06 +0000 (11:15 +0000)]
t/lei-watch.t: improve test reliability

On single CPU (and overloaded SMP) systems, we can't rely on
inotify in lei-daemon firing before a "lei note-event done"
client hits it.  So force in a single tick() to ensure the
scheduler can yield to lei-daemon and see the inotify wakeup
before "lei note-event done" to commit the write.

2 years agoinit: support git <2.30 for "-c KEY=VALUE" args
Eric Wong [Sun, 25 Jul 2021 10:40:17 +0000 (10:40 +0000)]
init: support git <2.30 for "-c KEY=VALUE" args

It turns out `--fixed-value' is a relatively new git-config(1)
feature in git 2.30+ (December 2020).  So use the quotemeta
perlop for now since it seems compatible-enough for POSIX ERE
used by git.

2 years agolei_mail_sync: locations_for API uses oidbin for comparisons
Eric Wong [Sun, 25 Jul 2021 00:43:32 +0000 (00:43 +0000)]
lei_mail_sync: locations_for API uses oidbin for comparisons

Favor oidbin use internally to reduce internal memory traffic.

2 years agolei_inspect: fix typo
Eric Wong [Sun, 25 Jul 2021 00:43:31 +0000 (00:43 +0000)]
lei_inspect: fix typo

Not sure how this wasn't caught, earlier...

2 years agolei_search: favor binary OID comparisons
Eric Wong [Sun, 25 Jul 2021 00:43:30 +0000 (00:43 +0000)]
lei_search: favor binary OID comparisons

Reduce memory traffic and code, too.

2 years agoextsearchidx: favor binary comparison in common case
Eric Wong [Sun, 25 Jul 2021 00:43:29 +0000 (00:43 +0000)]
extsearchidx: favor binary comparison in common case

We'll use 20-byte SHA-1 comparisons instead of 40-byte
hex representations for a minor reduction in memory
traffic.

2 years agoextsearchidx: use more appropriate max for dedupe
Eric Wong [Sun, 25 Jul 2021 00:11:03 +0000 (00:11 +0000)]
extsearchidx: use more appropriate max for dedupe

The over.msgid table may contain ghost Message-IDs and also
Message-IDs of deleted spam messages, so over->max isn't a
good aproproximation of dedupe progress.

2 years agoextindex: improve comment around git->async_wait_all
Eric Wong [Sun, 25 Jul 2021 00:11:02 +0000 (00:11 +0000)]
extindex: improve comment around git->async_wait_all

I found myself tempted to remove this, but it appears impossible
due to odd messages which have multiple Message-IDs.

2 years agoextindex: support --dedupe[=MSGID]
Eric Wong [Sun, 25 Jul 2021 00:11:01 +0000 (00:11 +0000)]
extindex: support --dedupe[=MSGID]

Sometimes I just want to dedupe a single Message-ID to test
something, and this lets me do it.

This patch appears to do what its supposed to.  But it also
appears to be finding duplicates that were previously missed.
That's a good thing, but I wish I understood what seems to be
fixed :x

I'm not sure why the previous ExtSearchIdx.pm (blob 357312b8)
was causing messages to be missed, even, and why this patch
seems to fix it...  And it's not infinite looping, either.

Anyways, before this patch, "-extindex --dedupe" was taking ~5
min to no-op every message (after the initial full --dedupe run
which took over a day to run).  No-op --dedupes now take just
under 2 hours to scan every single cross-posted message for a
no-op dedupe.  The initial dedupe took nearly 44 hours on my
system for <https://yhbt.net/lore/all/> due to SATA-2 TLC SSD
latency on 3 gigantic Xapian shards.

Running --dedupe with this change seems to prevent
/BUG\?.*?not deduplicated properly/ stderr messages from being
triggered by View.pm.  Current versions of -extindex do not
seem susceptible to introducing duplicates.

2 years agolei rm-watch: new command to support removing watches
Eric Wong [Fri, 23 Jul 2021 10:56:12 +0000 (10:56 +0000)]
lei rm-watch: new command to support removing watches

Pretty trivial since it just invokes "git-config".  It's mainly
intended to make shell completion easier.

2 years agolei: avoid SQLite COUNT() for dedupe
Eric Wong [Fri, 23 Jul 2021 10:56:11 +0000 (10:56 +0000)]
lei: avoid SQLite COUNT() for dedupe

SQLite COUNT() is a slow operation that does a full table scan
with no conditions.  There's no need for it, since lei dedupe
only needs to know if it's empty or not to decide between
new/ and cur/ for Maildir outputs.

2 years agot/lei*: check error messages on failures
Eric Wong [Fri, 23 Jul 2021 10:56:10 +0000 (10:56 +0000)]
t/lei*: check error messages on failures

I just hit an unreproducible failure in t/lei-p2q.t and
lacked $lei_err information to diagnose it.  Hopefully
this helps track down odd failures in the future.

2 years agot/solver_git: use like() to improve error reporting
Eric Wong [Thu, 22 Jul 2021 08:37:36 +0000 (08:37 +0000)]
t/solver_git: use like() to improve error reporting

I hit a test failure here, but haven't been able to reproduce
it...

2 years agolei: auto-refresh watches in config, cancel missing
Eric Wong [Wed, 21 Jul 2021 14:07:06 +0000 (14:07 +0000)]
lei: auto-refresh watches in config, cancel missing

This makes behavior less surprising on restarts as we no longer
lose state on restarts, so there's no need to manually run "lei
add-watch" to re-enable watches.  This also allows us to
transparently handle changes if somebody edits the lei config
file directly or via git-config(1).

2 years agolei: start implementing inotify Maildir support
Eric Wong [Mon, 19 Jul 2021 08:59:35 +0000 (08:59 +0000)]
lei: start implementing inotify Maildir support

This allows lei to automatically note keyword (message flag)
changes made to a Maildir and propagate it into lei/store:

lei add-watch --state=tag-ro /path/to/Maildir

This doesn't persist across restarts, yet.  In the future,
it will be applied automatically to "lei q" output Maildirs
by default (with an option to disable it).

State values of tag-rw, index-<ro|rw>, import-<ro|rw> will all
be supported for Maildir.

This represents a fairly major internal change that's fairly
intrusive, but the whole daemon-oriented design was to
facilitate being able to automatically monitor (and propagate)
Maildir/IMAP flag changes.

2 years agoinit: allow arbitrary key-values via -c KEY=VALUE
Eric Wong [Wed, 21 Jul 2021 14:05:50 +0000 (14:05 +0000)]
init: allow arbitrary key-values via -c KEY=VALUE

This won't blindly append identical key=values, but
allows specifying multiple, different key=value pairs
as long as the values are different.

2 years agoextsearch: support publicinbox.*.boost parameter
Eric Wong [Wed, 21 Jul 2021 14:05:49 +0000 (14:05 +0000)]
extsearch: support publicinbox.*.boost parameter

This behaves identically the lei external "boost" parameter in
prioritizing raw messages for extindex.

Relying exclusively on the config file order doesn't work well
for mirrors since it's impossible to guarantee config file
ordering via grokmirror hooks.

Config file ordering remains the default if boost is
unconfigured, or in case of ties.

Note: I chose the name "boost" rather than "priority" or "rank"
since I always get confused by whether higher or lower numbers
take precedence when it comes to kernel scheduling.  "weight" is
also a part of Xapian API terminology, which we currently do not
expose to configuration (but may in the future).

2 years agohttpd: fix SIGHUP by invalidating cache on reload
Eric Wong [Tue, 20 Jul 2021 08:58:58 +0000 (08:58 +0000)]
httpd: fix SIGHUP by invalidating cache on reload

Since we require separate PublicInbox::HTTPD instances for each
listen socket address (in order to support {SERVER_<NAME|PORT>}
for PSGI env), the old cache needed to be invalidated on rare
app refreshes.

SIGHUP has always been broken in -httpd (but not -imapd or
-nntpd) due to this cache.

Update the daemon documentation and 5.10.1-ize some bits while
we're in the area.

2 years agoconfig: s/_one_val/get_1/ for public use
Eric Wong [Tue, 13 Jul 2021 11:06:13 +0000 (11:06 +0000)]
config: s/_one_val/get_1/ for public use

We'll be using this in lei for watch configs.

2 years agoextindex: dedupe: reduce SQLite contention and dirty data
Eric Wong [Thu, 8 Jul 2021 08:25:19 +0000 (08:25 +0000)]
extindex: dedupe: reduce SQLite contention and dirty data

Complex queries causes SQLite to block readers for longer than
their retry period.  For dedupe, it was also preventing us from
making good use of checkpoints due to the query time.

With many deduplications, checkpoints are necessary to maintain
system health due to having too much data piled up.

2 years agoextsearchidx: ignore Eml warnings across the board
Eric Wong [Wed, 7 Jul 2021 23:24:55 +0000 (23:24 +0000)]
extsearchidx: ignore Eml warnings across the board

There's nothing we can do about misformatted emails and headers
we get from untrusted sources.  They're too noisy and those
messages already exist in public-inboxes, anyways, so just
keep things quiet so we can spot real problems more easily.

2 years agoextindex: --gc: avoid SQLite lock conflict on shard cleanup
Eric Wong [Tue, 6 Jul 2021 12:42:03 +0000 (12:42 +0000)]
extindex: --gc: avoid SQLite lock conflict on shard cleanup

Xapian shard cleanup only requires read-only access to
over.sqlite3, so avoid opening it with read-write access since
create_tables will hit lock conflicts on "INSERT OR IGNORE"
statements.

2 years agoextindex: implement --dedupe to fix old extindices
Eric Wong [Tue, 6 Jul 2021 12:42:02 +0000 (12:42 +0000)]
extindex: implement --dedupe to fix old extindices

This is intended to fix older indices that had deduplication
bugs for matching content.  It'll also make dealing with
future changes to ContentHash easier since that's never
guaranteed stable.

It also supports --dry-run to print changes only without
making them.

2 years agoeml: relax warn_ignore regexps for current Email::Address::XS
Eric Wong [Tue, 6 Jul 2021 12:42:01 +0000 (12:42 +0000)]
eml: relax warn_ignore regexps for current Email::Address::XS

These seem needed with the data I'm currently working on, but I
haven't changed my version of Email::Address::XS since my last
Debian stable upgrade (to buster).

2 years agolei: drop workers on EOF from clients
Eric Wong [Sun, 4 Jul 2021 19:35:54 +0000 (19:35 +0000)]
lei: drop workers on EOF from clients

Sometimes a user will be bored waiting for a command to finish,
so ensure we drop disconnect workers in this case.

2 years agolei import: increase flags search batch size, display progress
Eric Wong [Fri, 2 Jul 2021 21:02:23 +0000 (21:02 +0000)]
lei import: increase flags search batch size, display progress

IMAP flag-only synchronization doesn't fetch entire messages,
so we can safely bump the batch size iff a user specified one
for full messages to 10000 times that.

Since I sometimes wonder why nothing happens for several seconds
after starting "lei import $URL", we'll also show some progress
during the flag synchronization phase.

2 years agolei inspect: help+completion for --dir option
Eric Wong [Fri, 2 Jul 2021 20:42:24 +0000 (20:42 +0000)]
lei inspect: help+completion for --dir option

It's the most generic name I could find for it since it can
mean so many things...

2 years agoextsearchidx: extra assertions for deduplication flow
Eric Wong [Fri, 2 Jul 2021 20:42:09 +0000 (20:42 +0000)]
extsearchidx: extra assertions for deduplication flow

I haven't found any bugs from this (still looking for missed
deduplication bugs), and it's a bit shorter and more likely to
catch future bugs.  Clean up an unnecessary ->{mid} array copy
while we're at it, too.

2 years agolei inspect: support "mid:" (and "m:") prefix
Eric Wong [Thu, 1 Jul 2021 11:31:33 +0000 (11:31 +0000)]
lei inspect: support "mid:" (and "m:") prefix

Using this to track down deduplication failures in -extindex...

2 years agolei inspect: support automatic pager in output
Eric Wong [Thu, 1 Jul 2021 11:31:32 +0000 (11:31 +0000)]
lei inspect: support automatic pager in output

All commands which output non-trivial amounts of data to
the terminal should support this.

2 years agoextsearchidx: lock before writing multi-pack-index
Eric Wong [Wed, 30 Jun 2021 22:00:20 +0000 (22:00 +0000)]
extsearchidx: lock before writing multi-pack-index

This avoids errors from git in case -extindex gets invoked in
parallel.

2 years agoextsearchidx: symlink .rev and .bitmap files into ALL.git
Eric Wong [Wed, 30 Jun 2021 19:14:48 +0000 (19:14 +0000)]
extsearchidx: symlink .rev and .bitmap files into ALL.git

It's possible for these to exist and git can (or may eventually)
take advantage of them to speed up functionality which affects
us.

2 years agosearchidx: default BATCH_BYTES to 8MB on 64-bit systems
Eric Wong [Wed, 30 Jun 2021 17:58:54 +0000 (17:58 +0000)]
searchidx: default BATCH_BYTES to 8MB on 64-bit systems

This default seems closer to reasonable on 64-bit systems which
are the norm these days.  32-bit systems gain 48K so it's an
even 1 MB, but we need to keep 32-bit systems from using too
much since there's still some ancient systems out there with
small inboxes.

2 years agowww: fix manifest.js.gz for default publicInbox.grokManifest
Eric Wong [Mon, 28 Jun 2021 21:59:06 +0000 (21:59 +0000)]
www: fix manifest.js.gz for default publicInbox.grokManifest

ManifestJsGz->response was not invoking the new "url_filter"
method properly.  Furthermore, fix url_filter for returning 404
responses.

Reported-by: Kyle Meyer <kyle@kyleam.com>
Link: https://public-inbox.org/meta/87fsx3128a.fsf@kyleam.com/
Fixes: 520be116e8a686cb ("www_listing: start updating for pagination + search")
2 years agoextindex: maintain pack symlinks and use "git multi-pack-index"
Eric Wong [Fri, 25 Jun 2021 01:06:39 +0000 (01:06 +0000)]
extindex: maintain pack symlinks and use "git multi-pack-index"

This is a fair amount of complexity, but it speeds up
"git cat-file --batch" startup by 3-4% with 50K packfiles
with a hot kernel cache.

This appears extremely sensitive to RAM available to
the kernel page cache with my SATA 2 SSD.  Faster storage
and more RAM can bring loading pack.

2.60s vs 2.69s were the best cases on my workstation with and
without the multi-pack-index, however times could be all over
the place (even in the minutes) with more activity on my
workstation.

Getting sub-minute times requires a git patch to speed up
alt_odb_usable():
  <https://lore.kernel.org/20210624005806.12079-1-e@80x24.org/>
Otherwise, prepare to wait several minutes.

2 years agowww_listing: fix manifest.js.gz generation with extindex "all"
Eric Wong [Thu, 24 Jun 2021 12:59:09 +0000 (12:59 +0000)]
www_listing: fix manifest.js.gz generation with extindex "all"

WwwListing and ManifestJsGz may be too different nowadays to
be worth the code sharing between them.

Update some comments and note we still needs better tests :x

Fixes: 520be116e8a686cb ("www_listing: start updating for pagination + search")
2 years agov2writable: avoid spawning "git hash-object"
Eric Wong [Thu, 24 Jun 2021 08:41:56 +0000 (08:41 +0000)]
v2writable: avoid spawning "git hash-object"

We have git_sha() nowadays that's used everywhere, so avoid
process spawning overhead for "git hash-object".

2 years agodoc: tuning: add a note about Linux sys.vm.max_map_count
Eric Wong [Thu, 24 Jun 2021 08:32:05 +0000 (08:32 +0000)]
doc: tuning: add a note about Linux sys.vm.max_map_count

git tends to die when mmap(2) fails on this limit, so let
users know about it.  Perhaps git could gracefully fallback.

2 years agofavor git(1) rather than libgit2 for ExtSearch
Eric Wong [Thu, 24 Jun 2021 05:50:04 +0000 (05:50 +0000)]
favor git(1) rather than libgit2 for ExtSearch

While both git and libgit2 take around 16 minutes to load 100K
alternates there's already a proposed patch to make git faster:

  <https://lore.kernel.org/git/20210624005806.12079-1-e@80x24.org/>

It's also easier to patch and install git locally since the
git.git build system defaults to prefix=$HOME and dealing with
dynamic linking with libgit2 is more difficult for end users
relying on Inline::C.

libgit2 remains in use for the non-ALL.git case, but maybe it's
not necessary (libgit2 is significantly slower than git in
Debian 10 due to SHA-1 collision checking).

2 years agowww: do not warn on blank query parameters
Eric Wong [Wed, 23 Jun 2021 11:14:22 +0000 (07:14 -0400)]
www: do not warn on blank query parameters

Sometimes users (or bots) may lead queries with '&' and
trigger uninitialized variable warnings, just ignore them
and give consumers a $ctx->{qp}->{''} entry.

While we're in the area, pass a regexp rather than scalar string
to the `split' perlop to prevent Perl from recompiling the
regexp on every call.

2 years agowww_listing: start updating for pagination + search
Eric Wong [Wed, 23 Jun 2021 11:14:21 +0000 (07:14 -0400)]
www_listing: start updating for pagination + search

When dealing with thousands of inboxes, displaying all of
them on a single page isn't going to work.  So steal some
pagination and search results code from the message search
to generate some basic HTML output that looks good in w3m.

2 years agosearch: make xap_terms easier-to-use and use it more
Eric Wong [Wed, 23 Jun 2021 11:14:20 +0000 (07:14 -0400)]
search: make xap_terms easier-to-use and use it more

This allows us to simplify callers throughout, and exceptions are
can no longer be silently hidden.  MiscSearch now uses xap_terms
for looking up eidx_key terms for a code reduction.

We also simplify LeiStore->_msg_kw for runtime use by moving the
MsetIterator handling into t/lei_store.t test case.

2 years agot/hl_mod: accept "make" or "makefile" for Makefile
Alyssa Ross [Tue, 22 Jun 2021 12:09:20 +0000 (12:09 +0000)]
t/hl_mod: accept "make" or "makefile" for Makefile

Version 4.0 of highlight has renamed the "make" language to
"makefile".  So just check the string starts with "make", to handle
both 3.x and 4.x.

I tested that public-inbox does actually work with highlight 4 -- it
can highlight my Makefile fine. :)

2 years agolei: use open() perlop for -C (chdir)
Eric Wong [Tue, 22 Jun 2021 10:04:36 +0000 (10:04 +0000)]
lei: use open() perlop for -C (chdir)

This is for consistency with the open() at initial accept, in
case we hit a code path which expects Perl directory handles
rather than "file handles".  Both work with the chdir() perlop
(fchdir(2), in our case).

2 years agolei import: help + completion for --new-only
Eric Wong [Sun, 20 Jun 2021 08:39:47 +0000 (08:39 +0000)]
lei import: help + completion for --new-only

I've found it's very helpful for large IMAP folders.

2 years agolei sucks: don't warn or error out on missing dependencies
Eric Wong [Sun, 20 Jun 2021 04:33:19 +0000 (04:33 +0000)]
lei sucks: don't warn or error out on missing dependencies

%INC can hold undef.  This can be hit on a Linux machine missing
Linux::Inotify2.  Loading PublicInbox::KQNotify is attempted and
PublicInbox/KQNotify.pm always exists, causing the `undef' entry
in %INC when it fails to load IO::KQueue.

$ perl -MData::Dumper -I lib \
-E 'eval { require PublicInbox::KQNotify }; say Dumper(\%INC)'

2 years agoview: extra check to for redundant messages in HTML view
Eric Wong [Sat, 19 Jun 2021 03:22:28 +0000 (03:22 +0000)]
view: extra check to for redundant messages in HTML view

There appears to be some cases of duplicates appearing due to
-extindex.  I haven't nailed down the cause of it, yet, but
this should make things easier for readers using the PSGI
HTML interface in the meantime.

The raw mboxrd remains undeduplicated for now, and the
correct fix/workaround would be some fsck-like mode for
public-inbox-extindex.

2 years agoscripts: add syscall-list tool for development
Eric Wong [Fri, 18 Jun 2021 21:44:38 +0000 (18:44 -0300)]
scripts: add syscall-list tool for development

We'll be supporting inotify directly as we do with epoll so so
Linux users won't have to deal with XS, extra DSOs or install
Linux::Inotify2 (and common::sense) modules.

2 years agot/sigfd: add diagnostic for occasional FreeBSD failure
Eric Wong [Fri, 18 Jun 2021 19:28:13 +0000 (10:28 -0900)]
t/sigfd: add diagnostic for occasional FreeBSD failure

Not 100% sure what's going on, here...

2 years agolei/store: do not put NULL into over.num column
Eric Wong [Fri, 18 Jun 2021 19:20:31 +0000 (19:20 +0000)]
lei/store: do not put NULL into over.num column

Simplify oid2docid and filter out undefined docids in ->add_eml,
instead.  This avoids SQLite "datatype mismatch" errors in
OverIdx->add_over

Fixes: d1052f03ea85d4af ("lei/store: cull redundant docids based on blob OID")
2 years agolei/store: cull redundant docids based on blob OID
Eric Wong [Thu, 17 Jun 2021 22:00:47 +0000 (22:00 +0000)]
lei/store: cull redundant docids based on blob OID

I'm not sure how this happened (only once for me in March), but
it should not happen...  In any case, we'll operate on the
lowest numbered docid and cull redundant index entries when
lei/store is open for read-write.

This also fixes the normal lei/store removal path to clean up
the xref3 table (since it's not done automatically for
public-facing -eidx due to the multi-list nature of it).

2 years agolei_input: prefix bare Maildir paths w/ "maildir:"
Eric Wong [Thu, 17 Jun 2021 22:00:46 +0000 (22:00 +0000)]
lei_input: prefix bare Maildir paths w/ "maildir:"

This will simplify upcoming code for watches.

2 years agolei inspect: learn "num:" and "docid:" prefixes
Eric Wong [Thu, 17 Jun 2021 22:00:45 +0000 (22:00 +0000)]
lei inspect: learn "num:" and "docid:" prefixes

"num:" is useful for inspecting Inbox-ish directories, while
"docid:" can be used for any Xapian DB (not just stuff managed
by our code).

2 years agolei index+import: reject keywords from R/O IMAP
Eric Wong [Sun, 13 Jun 2021 18:12:06 +0000 (18:12 +0000)]
lei index+import: reject keywords from R/O IMAP

Since users can't set IMAP flags in read-only IMAP folders,
we won't clobber local flags when importing from IMAP.  This
also enables the local_blob fallback used for lei-index to
be used for index deduplication.

2 years agolei_input: allow keywords when importing 1 file from Maildir
Eric Wong [Sun, 13 Jun 2021 18:12:05 +0000 (18:12 +0000)]
lei_input: allow keywords when importing 1 file from Maildir

This will eventually be useful for supporting inotify watches
on Maildir.  It will also allow users to script their own FS
watchers more easily.

2 years agonet_reader: canonicalize URL args on add_url
Eric Wong [Sat, 12 Jun 2021 00:10:45 +0000 (00:10 +0000)]
net_reader: canonicalize URL args on add_url

This fixes cases when users specify an IMAP or NNTP URL
with standard port numbers explicitly.

In other words, this allows users to use
"lei ls-mail-source nntps://public-inbox.org:563/" and
"lei ls-mail-source imaps://public-inbox.org:993/"
without hitting "BUG:" errors.

2 years agolei import: use url_folder_cache for completion
Eric Wong [Sat, 12 Jun 2021 00:10:44 +0000 (00:10 +0000)]
lei import: use url_folder_cache for completion

And fix "lei index" completion while we're at it.

2 years agot/lei-import-http: quiet unnecessary diag message
Eric Wong [Sat, 12 Jun 2021 00:10:43 +0000 (00:10 +0000)]
t/lei-import-http: quiet unnecessary diag message

Leftover while writing the test.

2 years agolei ls-mail-source: write through to URL folder cache
Eric Wong [Sat, 12 Jun 2021 00:10:42 +0000 (00:10 +0000)]
lei ls-mail-source: write through to URL folder cache

We'll be able to use this for shell completion for
lei import, lcat, tag, etc..

This also adds --url support for scripting purposes.

2 years agolei: stop pager early on exit
Eric Wong [Sat, 12 Jun 2021 00:10:41 +0000 (00:10 +0000)]
lei: stop pager early on exit

This is necessary when using "ls-mail-source" on an unreachable
IMAP server.

2 years agolei ls-mail-source: list IMAP folders and NNTP groups
Eric Wong [Fri, 11 Jun 2021 09:42:40 +0000 (09:42 +0000)]
lei ls-mail-source: list IMAP folders and NNTP groups

While other tools can provide the same functionality, having
integration with git-credential is convenient, here.  Caching
and completion will be implemented separately.

2 years agolei tag: less confusing warning about unimported messages
Eric Wong [Wed, 9 Jun 2021 23:27:50 +0000 (20:27 -0300)]
lei tag: less confusing warning about unimported messages

"unimported" is more meaningful than "missing", here.  And
instead of having every worker spew about unimported messages,
we'll accumulate and only print one warning line.  This
necessitated alterating ->DESTROY behavior and persisting
the client socket within the $lei object itself, not just
the PktOp consumer object.

2 years agolei import: support --new-only for IMAP
Eric Wong [Wed, 9 Jun 2021 22:39:24 +0000 (22:39 +0000)]
lei import: support --new-only for IMAP

Taking ~40s to synchronize a ~75K message IMAP folder is
still a lot of time, so support an option to only touch
new messages.

This is similar to "offlineimap -q" (quick) or "mbsync --new"
switches, but lei already accepts "-q" as a shortcut for
--quiet.  "--new" could work, but "--new-only" might be more
descriptive (or "--only-new"?), since the default fetches
also fetches new messages.

v2: warn for non-IMAP sources, I'm not sure it's worth it for
    Maildir or other sources, yet.  It will also make sense
    for MH and JMAP once we support them.

2 years agolei prune-mail-sync: new command to prune invalid sync data
Eric Wong [Wed, 9 Jun 2021 07:47:51 +0000 (07:47 +0000)]
lei prune-mail-sync: new command to prune invalid sync data

This will be invoked automatically by "lei import" eventually,
but it may make sense to expose as a separate command.

2 years agolei_mail_sync: hoist out --all handling from export-kw
Eric Wong [Wed, 9 Jun 2021 07:47:50 +0000 (07:47 +0000)]
lei_mail_sync: hoist out --all handling from export-kw

We'll be reusing it in other commands, too.

2 years agolei tag: parallelize Maildir access
Eric Wong [Wed, 9 Jun 2021 07:47:49 +0000 (07:47 +0000)]
lei tag: parallelize Maildir access

Since Maildir isn't guaranteed to have any sort of order, we
can parallelize inputs, here.  On a 4-core system, this reduced
one of my tag invocations from 5.5 to 1.4s.

2 years agomdir_reader: maildir_each_file: pass flags, skip Trash
Eric Wong [Wed, 9 Jun 2021 07:47:48 +0000 (07:47 +0000)]
mdir_reader: maildir_each_file: pass flags, skip Trash

This is a slight behavior change for "lei q": Trashed
(but not-yet-expunged) messages no longer get unlinked
when --output is used without --augment.

2 years agoinbox_writable: fix import_maildir
Eric Wong [Wed, 9 Jun 2021 07:47:47 +0000 (07:47 +0000)]
inbox_writable: fix import_maildir

I'm not sure if anybody uses this, but it exists.  It'll likely
be dropped in the future.

Fixes: fa3f0cbcd1af5008 ("use MdirReader in -watch and InboxWritable")
2 years agolei/store: do eidx_init before creating R/W lms dbh
Eric Wong [Wed, 9 Jun 2021 10:03:05 +0000 (10:03 +0000)]
lei/store: do eidx_init before creating R/W lms dbh

Sharing lms->{dbh} with eidx shards appears to be the cause of
the "Issuing rollback() due to DESTROY without explicit
disconnect() of DBD::SQLite::db handle" messages I've been
seeing from "lei up".

2 years agolei edit-search: fix and add a (weak) test
Eric Wong [Wed, 9 Jun 2021 00:11:11 +0000 (00:11 +0000)]
lei edit-search: fix and add a (weak) test

This broke recently and lacked an automated test, so rely on
EDITOR=cat to ensure we have some coverage.

Fixes: d2670108f71b1eff ("pkt_op: make pkt_do an OO method")
2 years agolei pmdir: fix nproc for <= 4 CPUs
Eric Wong [Tue, 8 Jun 2021 23:56:13 +0000 (23:56 +0000)]
lei pmdir: fix nproc for <= 4 CPUs

I forgot my FreeBSD VM has 8 cores, actually, and tweaked the
nproc detection on that machine before finalizing commit
10b523eb017162240b1ac3647f8dcbbf2be348a7
("lei import: speed up repeated Maildir imports")

Fixes: 10b523eb01716224 ("lei import: speed up repeated Maildir imports")
2 years agolei import: speed up repeated Maildir imports
Eric Wong [Tue, 8 Jun 2021 09:50:21 +0000 (09:50 +0000)]
lei import: speed up repeated Maildir imports

On a 4-core CPU, this speeds up "lei import" on a largish
Maildir inbox with 75K messages from ~8 minutes down to ~40s.

Parallelizing alone did not bring any improvement and may
even hurt performance slightly, depending on CPU availability.
However, creating the index on the "fid" and "name" columns in
blob2name yields us the same speedup we got.

Parallelizing IMAP makes more sense due to the fact most IMAP
stores are non-local and subject to network latency.

Followup-to: bdecd7ed8e0dcf0b45491b947cd737ba8cfe38a3 ("lei import: speed up kw updates for old IMAP messages")
2 years agolei: generalize auxiliary WQ handling
Eric Wong [Tue, 8 Jun 2021 09:50:20 +0000 (09:50 +0000)]
lei: generalize auxiliary WQ handling

op_wait_event is now more lei-specific since we no longer have
to care about oneshot and use a synchronous loop.

{ikw} (import-keywords) started a trend, but LeiPmdir (parallel
Maildir) is an upcoming WQ class that will follow this idea.

Eventually, {l2m} usage may be updated to follow this, too.

2 years agolei: safety fix for multiple WQ classes
Eric Wong [Tue, 8 Jun 2021 09:50:19 +0000 (09:50 +0000)]
lei: safety fix for multiple WQ classes

For commands utilizing multiple workers, this simple change
generalizes the persistence mechanism and and prevents
lei->dclose from causing script/lei to exit if there are
still in-flight workers.

This ougth to prevent read-after-write consistency problems that
occasionally manifest in scripts (e.g. test cases) but usually
go unnoticed in normal use.

2 years agolei/store: checkpoint commits mail_sync.sqlite3
Eric Wong [Mon, 7 Jun 2021 19:06:30 +0000 (19:06 +0000)]
lei/store: checkpoint commits mail_sync.sqlite3

We mainly rely on ->done with lei/store, but moving to
->checkpoint probably makes sense.  Note: over, msgmap, and
mail_sync all have slightly different transacation behavior;
perhaps they can be unified in the future.

2 years agolei: don't drop WQ workers on normal exit
Eric Wong [Sat, 5 Jun 2021 21:06:06 +0000 (21:06 +0000)]
lei: don't drop WQ workers on normal exit

This is dangerous and causes race conditions on commands
which utilize multiple workqueues.

2 years agoINSTALL: note about lei metadata storage
Eric Wong [Sat, 5 Jun 2021 21:04:50 +0000 (21:04 +0000)]
INSTALL: note about lei metadata storage

Since lei is for personal mailboxes, I don't think lei needs to
keep keyword and label changes in history.  And fix a minor
wording problem ("or" => "nor") while we're at it.

2 years agopkt_op: make pkt_do an OO method
Eric Wong [Thu, 3 Jun 2021 09:52:06 +0000 (09:52 +0000)]
pkt_op: make pkt_do an OO method

This will make it easier to use for internal use such as
managing Maildir and IMAP IDLE watches.

2 years agopkt_op: remove blocking I/O support
Eric Wong [Thu, 3 Jun 2021 09:01:24 +0000 (09:01 +0000)]
pkt_op: remove blocking I/O support

Since lei-daemon is guaranteed to be running, there's no
need to keep blocking I/O support around (and we can
get it back via git if we need it).

Followup-to: 1d6e1f9a6a66a42d ("lei: require Socket::MsgHdr or Inline::C, drop oneshot")
2 years agolei import: speed up kw updates for old IMAP messages
Eric Wong [Thu, 3 Jun 2021 01:05:20 +0000 (01:05 +0000)]
lei import: speed up kw updates for old IMAP messages

On a 4-core CPU, this speeds up "lei import" on a largish IMAP
inbox with 75K messages from ~21 minutes down to 40s.

Parallelizing with the new LeiImportKw WQ worker class gives a
near-linear speedup and brought the runtime down to ~5:40.

The new idx_fid_uid index on the "fid" and "uid" columns of
blob2num in mail_sync.sqlite3 brought us the final speedup.

An additional index on over.sqlite3#xref3(oidbin) did not help,
since idx_nntp already exists and speeds up the new ->oidbin_exists
internal API.

I initially experimented with a separate "lei import-kw" command
but decided against it since it's useless outside of IMAP+JMAP
and would require extra cognitive overhead for both users and
hackers.  So LeiImportKw is just a WQ worker used by "lei import"
and not its own user-visible command.

v2: fix ikw_done_wait arg handling (ugh, confusing API :x)

2 years agolei export-kw: do not write directly to mail_sync.sqlite3
Eric Wong [Wed, 2 Jun 2021 10:03:25 +0000 (10:03 +0000)]
lei export-kw: do not write directly to mail_sync.sqlite3

Only the lei/store process should be writing to files/DBs
in lei/store.

2 years agolei: remove "forget" (old name for "rm")
Eric Wong [Tue, 1 Jun 2021 19:20:16 +0000 (19:20 +0000)]
lei: remove "forget" (old name for "rm")

"rm" is probably the better name for it, since it matches
"public-inbox-learn rm"

2 years agolei_mail_sync: more debug info for uncommitted txn
Eric Wong [Tue, 1 Jun 2021 19:14:28 +0000 (19:14 +0000)]
lei_mail_sync: more debug info for uncommitted txn

I'm not actually sure if I hit an uncommitted transaction just
now, it doesn't seem like it.

2 years agolei import: reduce writes to lei/store on IMAP sync
Eric Wong [Mon, 31 May 2021 10:20:06 +0000 (10:20 +0000)]
lei import: reduce writes to lei/store on IMAP sync

We don't need to write VMD changes to lei/store if local
keywords are unchanged.

2 years agolei import: import IMAP flag changes from old messages
Eric Wong [Sun, 30 May 2021 11:45:44 +0000 (11:45 +0000)]
lei import: import IMAP flag changes from old messages

This makes "lei import" behavior with IMAP folders more
consistent with that with Maildir.

Opening IMAP folders read-write with "SELECT" (instead of
read-only with "EXAMINE") was necessary, since it lets an IMAP
server communicate to us as to whether or not it's worth
refetching IMAP flags of previously imported messages.

Fetching UID+FLAGS only is one of the fastest IMAP operations
with dovecot, our -imapd and presumably other common IMAP servers.
It is issued by common MUAs such as mutt after every SELECT.

Users may now rely on "lei import" exclusively to merge mail and
keywords into lei/store, and "lei export-kw" to propagate
keyword changes back to IMAP servers.

A sticks-and-stones workflow for personal mailboxes is currently:

lei import imaps://$MY_PERSONAL_INBOX
lei q --mua=$MUA -o /tmp/results SEARCH TERMS...
# do stuff from within $MUA to /tmp/results
lei import /tmp/results # read keyword changes from MUA
lei export-kw imaps://$MY_PERSONAL_INBOX
# repeat when new stuff shows up in personal inbox

The next goal is to automate repeated imports + export-kw
commands with with inotify and IMAP IDLE.

2 years agolei: support implicit stdin by default
Eric Wong [Sun, 30 May 2021 06:33:58 +0000 (06:33 +0000)]
lei: support implicit stdin by default

This adds implicit stdin suppport for p2q and lcat,
while rm and rediff no longer need explicit support
for it.

2 years agolei lcat: support maildir: paths, too
Eric Wong [Sun, 30 May 2021 06:33:57 +0000 (06:33 +0000)]
lei lcat: support maildir: paths, too

This could be helpful in case when a Maildir is on a slow
or unmounted filesystem and lei/store is on fast storage.

2 years agolei lcat: allow IMAP folder URLs w/o UIDVALIDITY
Eric Wong [Sun, 30 May 2021 06:33:56 +0000 (06:33 +0000)]
lei lcat: allow IMAP folder URLs w/o UIDVALIDITY

Requiring UIDVALIDITY on the command-line is of course
unreasonable.

2 years agolei lcat+inspect: start wiring up completion
Eric Wong [Sun, 30 May 2021 06:33:55 +0000 (06:33 +0000)]
lei lcat+inspect: start wiring up completion

Colons and other delimiters still cause problems for our bash
completion, but some completion is better than no completion.

2 years agolei q: --sort and --save|v2 are incompatible
Eric Wong [Sat, 29 May 2021 20:20:39 +0000 (20:20 +0000)]
lei q: --sort and --save|v2 are incompatible

Saved searches rely on (reverse) docid ordering for efficient
incremental results, and sorting any other way prevents that.

Update comment description in LeiQuery while we're at it:
"ls-query" and "rm-query" are "ls-search" and "forget-search",
respectively, and "mv-query" is implicit with "edit-search"

2 years agolei import|lcat: improve+fix single message IMAP support
Eric Wong [Sat, 29 May 2021 20:20:38 +0000 (20:20 +0000)]
lei import|lcat: improve+fix single message IMAP support

lcat can now dump the memoized contents of entire IMAP folders,
not just a single UID.  It's now parallelized and pipelined for
multiple lei2mail workers.

Furthemore, various forms of JSON output work consistently
with blob-only output, now.

While working on this, I noticed NetReader was passing UID URLs
to imap_each callbacks, which was causing mail_sync.sqlite3 to
store UIDs in `folders' and clearly wrong so it's now fixed.

2 years agoTODO: add pipelining note
Eric Wong [Sat, 29 May 2021 20:20:37 +0000 (20:20 +0000)]
TODO: add pipelining note

Network latency is painful to deal with.