Eric Wong [Sat, 21 Dec 2019 08:00:03 +0000 (08:00 +0000)]
nntp: cmd_xrover: use named sub for long_response
Introduce xrover_i which does the same thing as the anonymous
sub it replaces.
Eric Wong [Sat, 21 Dec 2019 08:00:02 +0000 (08:00 +0000)]
nntp: hdr_searchmsg: use named sub for numeric range response
Introduce searchmsg_range_i, which does the same thing as
the anonymous sub it replaces.
Eric Wong [Sat, 21 Dec 2019 08:00:01 +0000 (08:00 +0000)]
nntp: remove cyclic refs from long_response
Leftover cyclic references are a source of memory leaks. While
our code is AFAIK unaffected by such leaks at the moment,
eliminating a potential source of bugs will make maintenance
easier.
We make the long_response API cycle-free by stashing the
callback into the NNTP object. However, callers will need
to be updated to get rid of the circular reference to $self.
We do that be replacing anonymous subs with name subroutine
references, such as xref_range_i replacing the formerly
anonymous sub inside hdr_xref.
Eric Wong [Sat, 21 Dec 2019 08:00:00 +0000 (08:00 +0000)]
nntp: get_range: return scalarref for $beg
...Instead of just returning a plain scalar inside an arrayref.
This is because we usually pass the result of NNTP::get_range to
Msgmap::msg_range. Upcoming changes will move us away from
anonymous subroutines, so this change will make followup commits
easier-to-digest as modifications to the underlying scalar can
be more easily propagated between non-anonymous-subs.
Eric Wong [Sat, 21 Dec 2019 23:53:19 +0000 (23:53 +0000)]
http: avoid anonymous sub for getline callback
We can avoid the danger of self-referential subs entirely for
code internal to PublicInbox::HTTP.
This change was only made possible by
commit
8e1c3155da4edc082e8e3d8b30351f0c861757a7
("ds: pass $self to code references")
Eric Wong [Sat, 21 Dec 2019 23:53:18 +0000 (23:53 +0000)]
http: get rid of anonymous subs for write/close
Each sub costs us several kilobytes of memory for every
response we make. An arrayref only costs 80 bytes on
64-bit, so bless that to packages with appropriate ->write
and ->close methods.
Eric Wong [Sun, 22 Dec 2019 00:12:12 +0000 (00:12 +0000)]
nntp: get rid of some unused imports
Our NNTP code no longer relies on search or Xapian. Msgmap
and Git modules are loaded anyways through Inbox->(git|mm|over)
methods, however.
Eric Wong [Sun, 22 Dec 2019 00:12:45 +0000 (00:12 +0000)]
nntp: simplify method detection using UNIVERSAL::can
No need to do an eval dance or disable strict refs.
Eric Wong [Sun, 22 Dec 2019 03:54:46 +0000 (03:54 +0000)]
testcommon: require_git: use "plan" from Test::More
require_git is no longer in the "::main" namespace, so we must
call Test::More::plan() explicitly.
Eric Wong [Fri, 20 Dec 2019 06:58:27 +0000 (06:58 +0000)]
searchview: save a column in &x=t thread skeleton
Displaying "100%" wastes a precious column. Show "99%" instead
since there's little practical difference and <xapian/mset.h>
states:
Note that these generally aren't percentages of anything meaningful
(unless you use a custom weighting formula where they are!)
And we're not using a custom weighting formula.
Eric Wong [Thu, 19 Dec 2019 05:18:01 +0000 (05:18 +0000)]
view: show percentage in search results thread skeleton
The displays the Xapian ->get_percent value in the skeleton to
improve scanning of relevancy; irrelevant results do not display
that.
This fixes broken #anchor links introduced in the previous
commit, irrelevant messages now link to the /$INBOX/$MESSAGE_ID page.
Eric Wong [Thu, 19 Dec 2019 05:18:00 +0000 (05:18 +0000)]
searchthread: fix usage of user-supplied parameter
Instead of only passing an Inbox object, we'll pass the $ctx
reference as PublicInbox::SearchView::mset_thread did.
So although mset_thread was wrong, we now make it's usage
of SearchThread::thread correct and update other callers to
favor the new style of passing the entire $ctx (with ->{-inbox})
instead of just the Inbox object.
This makes the thread skeleton at the bottom of the search
page to show subjects of messages, but unfortunately links to
non-existent #anchors. The next commit will fix that.
While we're at it, favor "\&foo" over "*foo" since the former
makes the code reference (aka "function pointer) obvious so it
won't be confused for other things named "foo" in that
scope (e.g. $foo/@foo/%foo).
Eric Wong [Thu, 19 Dec 2019 08:38:51 +0000 (08:38 +0000)]
testcommon: fix run_script for older Perls
Using Perl "open" to dup(2) and save the old handles is required
since "local *STDIN = *STDIN" does not work on old Perls. Even
worse, this was silently a no-op when tested with Perl 5.24.1 on
Debian 9.x and led to confusing failures in the t/httpd-corner.t
lsof(1) tests when run after t/v2mirror.t from the same worker
process using t/run.perl.
Eric Wong [Wed, 18 Dec 2019 03:36:45 +0000 (03:36 +0000)]
t/run.perl: to avoid repeated process spawning for *.t
Spawning a new Perl interpreter for every test case
means Perl has to reparse and recompile every single file
it needs, costing us performance and development time.
Now that we've modified our code to avoid global state,
we can preload everything we need.
The new "check-run" test target is now 20-30% faster
than the original "check" target.
Eric Wong [Wed, 18 Dec 2019 03:36:44 +0000 (03:36 +0000)]
tests: move t/common.perl to PublicInbox::TestCommon
We want to be able to use run_script with *.t files, so
t/common.perl putting subs into the top-level "main" namespace
won't work. Instead, make it a module which uses Exporter
like other libraries.
Eric Wong [Wed, 18 Dec 2019 03:36:43 +0000 (03:36 +0000)]
t/*.t: avoid sharing "my" variables in subs
These usages of file-local global variables make the *.t files
incompatible with run_script(). Instead, use anonymous subs,
"our", or pass the parameter as appropriate.
Eric Wong [Wed, 18 Dec 2019 09:14:43 +0000 (09:14 +0000)]
msgiter: msg_part_text returns undef on text/html
We want HTML parts to be downloadable, but not displayed as
unreadable (but injection-safe) HTML source in our own web
and Atom interfaces.
This affects indexing, too, as HTML tags/comments won't be
indexed anymore, but existing indices are only cleaned after
--reindex. HTML-only mail won't be indexed at all, but we won't
cross that bridge until somebody cares about that crap. We'll
continue to actively discourage such waste of CPU cycles,
bandwidth, cache and storage.
Fixes: 7d82a8bc04ce2e68 (handle "multipart/mixed" messages which are not multipart')
Eric Wong [Wed, 18 Dec 2019 03:36:42 +0000 (03:36 +0000)]
Makefile.PL: sort target and var lists
Sorting makes it easier to review the generated result.
Eric Wong [Wed, 18 Dec 2019 03:36:41 +0000 (03:36 +0000)]
viewvcs: flesh out some functionality and test
Expose MAX_SIZE via "our" will make it possible
to use in tests, and configure, later.
Additionally, returning HTTP 500 code for big files is not an
Internal Server Error, just a memory limit... Some browsers
won't show our HTML response with the link to the raw file in
case of errors, either, so we'll return 200 to ensure users can
use the link to access the raw blob.
Finally, throw in some tests to the existing solver_git testcase,
since that was incomplete and was pointlessly loading Plack
modules without testing PSGI.
Eric Wong [Wed, 18 Dec 2019 03:36:40 +0000 (03:36 +0000)]
TODO: add UUCP address item
We should support historical archives from the old days,
but I'm not sure how to best go about it, for now, given
how tricky correct handling of modern email addresses is.
We can deal with it if/when somebody decides to import some
ancient archives...
Eric Wong [Sat, 14 Dec 2019 18:06:59 +0000 (18:06 +0000)]
Makefile.PL: allow overriding "prove" from make CLI
Development versions of Perl install "prove$VERSION"
where $VERSION is something like "5.31.7". This makes
it easier to test everything we have against development
versions of Perl5.
Note: I could not find a way to get quoting right to use the
"--exec $(PERL)" option of prove(1), but that would be the best
option for working transparently after running:
perl5.31.7 Makefile.PL
Eric Wong [Mon, 16 Dec 2019 08:07:34 +0000 (08:07 +0000)]
t/edit.t: drop redundant "delete local $ENV{...}"
"delete local" is only in Perl v5.11.0, and we only depend on
Perl v5.10.1. We already localize and delete it as two separate
statements immediately above.
I wish this was hidden behind a "use feature" flag like other
new-fangled things :<. Oh well, I think the oldest Perl actually
in use for this project is 5.16 (CentOS 7.x).
Eric Wong [Sun, 15 Dec 2019 23:11:07 +0000 (23:11 +0000)]
daemon: drop listeners early in master on graceful shutdown
For users not relying on socket activation via systemd (or
similar), we want to drop listeners ASAP so another process
can bind to their address. While we're at it, disable
TTIN and HUP handlers since we have no chance of starting
usable workers without listeners.
Eric Wong [Sun, 15 Dec 2019 23:11:06 +0000 (23:11 +0000)]
daemon: shorten lifetime of listener_names mapping
Keeping a ref to the IO::Socket handle was preventing
close(2) from being invoked on graceful shutdown of
worker.
Eric Wong [Sat, 14 Dec 2019 05:22:18 +0000 (05:22 +0000)]
address: explicitly reject local-only addresses
Apparently, neither our previous address parsing code nor
Email::Address::XS recognizes local, username-only addresses
in the form of <username> (without "@host"). Without
this change, Email::Address::XS->address would return
"undef", so we need to filter it out via "grep { defined }"
It seems the cases where users email each other on the same
machine is small and public-inbox won't be able to index
addresses for those cases... Oh well :/
Eric Wong [Sat, 14 Dec 2019 01:02:56 +0000 (01:02 +0000)]
address: use Email::Address::XS if available
Email::Address::XS is a dependency of modern versions of Email::MIME,
so it's likely loaded and installed on newer systems, already;
and capable of handling more corner-cases than our pure-Perl
fallback.
We still fallback to the imperfect-but-good-enough-in-practice
pure-Perl code while avoiding the non-XS Email::Address (which
was susceptible to DoS attacks (CVE-2015-7686)). We just need
to keep "git fast-import" happy.
Eric Wong [Sat, 14 Dec 2019 01:02:55 +0000 (01:02 +0000)]
address: use comment as name if no phrase available
Some users will set their From: headers in the form of:
"<user@example.com> (A U Thor)", where their name is in
the parenthesized comment. Use that instead of the
email address, if available.
Eric Wong [Sun, 15 Dec 2019 08:35:30 +0000 (08:35 +0000)]
inbox: fix periodic git process cleanup
We need to use $PublicInbox::DS::in_loop instead of ::running().
The latter is not valid for systems with signalfd or kqueue and
is now gone, completely.
Not needing periodic cleanups at all to deal with unlinked pack
indices will be a tougher task...
Eric Wong [Sun, 15 Dec 2019 03:37:56 +0000 (03:37 +0000)]
searchidx: do not modify read-only $1 via git_unquote
git_unquote works in-place, and we sometimes see strange
filenames, or badly munged diffs with terminal escape
characters (for colorization) end up in emails.
Eric Wong [Thu, 12 Dec 2019 21:16:49 +0000 (21:16 +0000)]
daemon: use DESTROY for unlinking --pid-file
This gets rid of the last "END{}" block in our code and cleans
up a (temporary) circular reference.
Furthermore, ensure the cleanup code still works in all
configurations by adding tests and testing both the -W1
(default, 1 worker) and -W0 (no workers) code paths.
Eric Wong [Thu, 12 Dec 2019 21:16:48 +0000 (21:16 +0000)]
ds: move NNTP-only expiration code into DS
We'll be supporting idle timeout for the HTTP code in the
future to deal directly with Internet-exposed clients w/o
Varnish or nginx.
Eric Wong [Thu, 12 Dec 2019 21:16:47 +0000 (21:16 +0000)]
ds: move EvCleanup code into DS
EvCleanup only existed since Danga::Socket was a separate
component, and cleanup code belongs with the event loop.
Eric Wong [Thu, 12 Dec 2019 08:04:53 +0000 (08:04 +0000)]
Makefile.PL: fix "dsyn" target
The "dsyn" target needs to remain working, despite still
being dependent on GNU-isms at the moment.
Fixes: 73fe3421f1ecbdc8 ("build: support doc generation w/o GNU make")
Eric Wong [Thu, 12 Dec 2019 08:03:39 +0000 (08:03 +0000)]
mbox: do not try to create filename from empty string
This was causing warnings to pop up in syslogs for messages with
empty Subject headers.
Eric Wong [Sun, 1 Dec 2019 22:04:25 +0000 (22:04 +0000)]
msgtime: avoid obviously out-of-range dates (for now)
Wacky dates show up in lore for valid messages. Lets ignore
them and let future generations deal with Y10K and time-travel
problems.
Eric Wong [Fri, 29 Nov 2019 12:25:08 +0000 (12:25 +0000)]
Date::Parse is now optional
-mda should not be dealing with broken Date: headers
nowadays, and deprioritize it in our documentation and
internal checks.
Eric Wong [Fri, 29 Nov 2019 12:25:07 +0000 (12:25 +0000)]
msgtime: drop Date::Parse for RFC2822
Date::Parse is not optimized for RFC2822 dates and isn't
packaged on OpenBSD. It's still useful for historical
email when email clients were less conformant, but is
less relevant for new emails.
Eric Wong [Fri, 29 Nov 2019 12:25:06 +0000 (12:25 +0000)]
add msgtime_cmp maintainer test
Changes will be coming for MsgTime to stop depending on
Date::Parse due to lack of package availability on OpenBSD
and suboptimal performance on RFC822 dates.
Eric Wong [Fri, 29 Nov 2019 12:25:05 +0000 (12:25 +0000)]
git: async batch interface
This is a transitionary interface which does NOT require an
event loop. It can be plugged into in current synchronous code
without major surgery.
It allows HTTP/1.1 pipelining-like functionality by taking
advantage of predictable and well-specified POSIX pipe semantics
by stuffing multiple git cat-file requests into the --batch pipe
With xt/git_async_cmp.t and GIANT_GIT_DIR=git.git, the async
interface is 10-25% faster than the synchronous interface since
it can keep the "git cat-file" process busier.
This is expected to improve performance on systems with slower
storage (but multiple cores).
Eric Wong [Sun, 1 Dec 2019 10:50:19 +0000 (10:50 +0000)]
build: support doc generation w/o GNU make
We can replace the GNU-isms for building docs with Perl5
equivalents. The only downside is the resulting Makefile
gets larger, but that's the price of portability.
Eric Wong [Fri, 29 Nov 2019 10:14:14 +0000 (10:14 +0000)]
import: (cleanup) drop redundant env arg to run_die
run_die() doesn't require an $env arg, so there's no
point passing "undef" to it.
Eric Wong [Fri, 29 Nov 2019 10:14:13 +0000 (10:14 +0000)]
spawn: remove support for clearing the env
It's unnecessary code which I'm not sure we ever used. In
retrospect, completely clearing the environment doesn't make
sense for the processes we spawn. We don't need to clobber
individual environment variables in our code, either
(and if we did for tests, we can use 'local').
Eric Wong [Fri, 29 Nov 2019 10:14:12 +0000 (10:14 +0000)]
tests: don't repeatly validate NEWS.atom
We can create a stamp to avoid rerunning the check unless
NEWS.atom changes (and it will, soon, I hope :>).
Eric Wong [Fri, 29 Nov 2019 10:14:11 +0000 (10:14 +0000)]
TODO: update and add a few more items
SpamAssassin has used re2c (via sa-compile) for many years, now,
and it seems to work fine, there. GMime also looks promising
when combined with Inline::C since GMime can operate on mmap-ed
regions.
Given the inevitable demise of many .orgs when price rise;
supporting a URL rewriter similar to .mailmap makes sense.
And HTTP CONNECT seems like something our -httpd can support
to let firewalled users read over NNTP.
Eric Wong [Fri, 29 Nov 2019 10:14:10 +0000 (10:14 +0000)]
ds: ->Reset initializes $nextq
I haven't noticed this being a problem in practice, but
be consistent with the rest of the singleton stuff.
Since we always call Reset() at load time, only do
initialization in that sub and not at declaration.
Eric Wong [Fri, 29 Nov 2019 10:14:09 +0000 (10:14 +0000)]
t/common: set $0 when running script w/o fork
We can localize changes to $0 so $0 is restored when the
"script" sub is done. This will be helpful when we encounter
a stuck/slow processes during our tests (hopefully never!)
Eric Wong [Fri, 29 Nov 2019 10:14:08 +0000 (10:14 +0000)]
t: localize the PI_CONFIG env
We don't want the user's ~/.public-inbox/config to be read from
during tests. I only noticed this because I had a non-existent
pathname for one of my inboxes :x
I've also verified this change by running "inotifywait
~/.public-inbox/config -m" in another terminal while running
"make check"; (perhaps a portable solution could make it
into the test suite).
Eric Wong [Thu, 28 Nov 2019 20:54:35 +0000 (20:54 +0000)]
replace: quiet "git gc" invocation
Since we give users no indication or control of how "git gc"
runs, showing its progress is confusing.
Eric Wong [Thu, 28 Nov 2019 20:54:34 +0000 (20:54 +0000)]
t/replace: quiet "git fsck" invocation
Test output can be a terminal if running as "perl -I lib t/$FOO.t",
and showing fsck progress is pointless for tests.
Eric Wong [Thu, 28 Nov 2019 07:08:54 +0000 (07:08 +0000)]
t/httpd-unix: FreeBSD expects to fail with EADDRINUSE
Tested FreeBSD 11.2. I'm starting to think I'm too conservative
with this check and it could be safely expanded to cover any OS
with UNIX sockets.
Eric Wong [Wed, 27 Nov 2019 11:07:18 +0000 (11:07 +0000)]
Makefile.PL: MANIFEST dependency fix
We need to force an update to Makefile (not Makefile.PL) when
MANIFEST changes. Since "Makefile" (aka. "$(FIRST_MAKEFILE)")
is already a single-colon make target; we can't create a
double-colon rule to augment it. So we'll continue using a
"Makefile.PL" rule, but have it recreate the resulting Makefile
Finally, change the "check" target to use "prove -b" instead of
"prove -l" so we test against "blib/lib", since what's in the
"blib" dir will be installed.
Fixes: 4c20de0694d06ff3 ("Makefile.PL: add dependency on MANIFEST contents")
Eric Wong [Wed, 27 Nov 2019 01:33:33 +0000 (01:33 +0000)]
httpd|nntpd: avoid missed signal wakeups
Our attempt at using a self-pipe in signal handlers was
ineffective, since pure Perl code execution is deferred
and Perl doesn't use an internal self-pipe/eventfd. In
retrospect, I actually prefer the simplicity of Perl in
this regard...
We can use sigprocmask() from Perl, so we can introduce
signalfd(2) and EVFILT_SIGNAL support on Linux and *BSD-based
systems, respectively. These OS primitives allow us to avoid a
race where Perl checks for signals right before epoll_wait() or
kevent() puts the process to sleep.
The (few) systems nowadays without signalfd(2) or IO::KQueue
will now see wakeups every second to avoid missed signals.
Eric Wong [Wed, 27 Nov 2019 01:33:32 +0000 (01:33 +0000)]
dskqxs: fix missing EV_DISPATCH define
Oops, IO::KQueue support was broken due to this missing
constant. Add a new ds-kqxs.t test case to ensure we
test the IO::KQueue path if IO::KQueue is available.
Eric Wong [Mon, 25 Nov 2019 05:24:54 +0000 (05:24 +0000)]
msgtime: deal with strange minutes in TZ offsets
I'm not sure if TZ minute offsets aside from '00' or '30' exist,
but lets just deal with them properly when negative. Examples
taken from various inboxes on lore.kernel.org. These are mostly
message from spammers, but some are legitimate messages.
Eric Wong [Mon, 25 Nov 2019 05:24:53 +0000 (05:24 +0000)]
t/msgtime: add more checks for known cases
Broken email clients sent the darndest things, make sure
we can still support them when we make Date::Parse optional.
Eric Wong [Mon, 25 Nov 2019 05:24:52 +0000 (05:24 +0000)]
t/msgtime: show date in test descriptions
Otherwise it's hard to figure what fails.
Eric Wong [Sun, 24 Nov 2019 00:22:37 +0000 (00:22 +0000)]
tests: move giant inbox/git dependent tests to xt/
xt/ is typically reserved for "eXtended tests" intended for
the maintainers and not ordinary users. Since these require
special configuration and do nothing by waste cycles
during startup, they qualify.
Eric Wong [Sun, 24 Nov 2019 00:22:36 +0000 (00:22 +0000)]
t/perf-*.t: use $ENV{GIANT_INBOX_DIR} consistently
It's more consistent with our current terminology and
"PI_DIR" is already used to override ~/.public-inbox/
(which holds "config" and possibly other files which affect
all inboxes for a particular user, but is not an inbox itself);
so stop advertising GIANT_PI_DIR in skip messages.
Eric Wong [Sun, 24 Nov 2019 00:22:35 +0000 (00:22 +0000)]
tests: quiet down commit graph
Newer versions of git enable the commit graph by default.
Since we blow away our temporary directories every test,
generating graphis is a waste and clutters stderr with
"Computing commit graph generation numbers" messages.
Eric Wong [Sun, 24 Nov 2019 00:22:34 +0000 (00:22 +0000)]
tests: use File::Temp->newdir instead of tempdir()
We'll also introduce a tmpdir() API to give tempdirs
consistent names.
Eric Wong [Sun, 24 Nov 2019 00:22:33 +0000 (00:22 +0000)]
xapcmd: replace Xtmpdirs with File::Temp->newdir
Since we're using Perl 5.10.1 and File::Temp 0.19+, we don't
need Xtmpdirs at all for cleaning up tempdirs on failure and
can just rely on the DESTROY handler provided by File::Temp.
Eric Wong [Sun, 24 Nov 2019 00:22:32 +0000 (00:22 +0000)]
t/nntpd-validate: get rid of threads dependency
Threads are officially discouraged by perl5-porters and proves
problematic with my Perl installation when using run_mode=1
to speed up tests. So just use fork() and pipes to share
results from Net::NNTP.
Eric Wong [Sun, 24 Nov 2019 00:22:31 +0000 (00:22 +0000)]
t/common: start_script replaces spawn_listener
We can shave several hundred milliseconds off tests which spawn
daemons by preloading and avoiding startup time for common
modules which are already loaded in the parent process.
This also gives ENV{TAIL} support to all tests which support
daemons which log to stdout/stderr.
Eric Wong [Sun, 24 Nov 2019 00:22:30 +0000 (00:22 +0000)]
daemon: avoid race when quitting workers
While the master process has a self-pipe to avoid missing
signals, worker processes lack that aside from a pipe to
detect master death.
That pipe doesn't exist when there's no master process,
so it's possible DS::close never finishes because it
never woke up from epoll_wait. So create a pipe on
the worker_quit signal and force it into epoll/kevent
so it wakes up right away.
Eric Wong [Sun, 24 Nov 2019 00:22:29 +0000 (00:22 +0000)]
daemon: use sigprocmask when respawning workers
We need to block signals in workers during respawns
until they're ready to receive signals.
Eric Wong [Sun, 24 Nov 2019 00:22:28 +0000 (00:22 +0000)]
daemon: use sigprocmask to block signals at startup
`$SIG{FOO} = "IGNORE"' will cause the daemon to miss signals
entirely. Instead, we can use sigprocmask to block signal
delivery until we have our signal handlers setup. This closes a
race where a PID file can be written for an init script and a
signal to be dropped via "IGNORE".
Eric Wong [Sun, 24 Nov 2019 00:22:27 +0000 (00:22 +0000)]
.gitignore: ignore local prove(1) files
As described in prove(1), .prove is storage for --state=save
and .proverc allows per-worktree customizations.
Eric Wong [Sun, 24 Nov 2019 00:22:26 +0000 (00:22 +0000)]
t/nntpd-tls: sometimes SSL_connect succeeds quickly
It seems caching can happen within OpenSSL or negotiation
can be delayed in some cases. In any case, don't barf on
PublicInbox::TLS::epollbit() when connect_SSL succeeds
unexpectedly.
Eric Wong [Sun, 24 Nov 2019 00:22:25 +0000 (00:22 +0000)]
t/httpd-corner: wait for worker process death
We need to ensure the worker process is terminated before
starting a new connection, so leave a persistent HTTP/1.1
connection open and wait for the SIGKILL to take effect
and drop the client.
Eric Wong [Sun, 24 Nov 2019 00:22:24 +0000 (00:22 +0000)]
t/xcpdb-reshard: test xcpdb --compact
We did not have a test for this, and need to guard against
regressions when changing Xapcmd to use File::Temp->newdir
in future commits.
Eric Wong [Sun, 24 Nov 2019 00:22:23 +0000 (00:22 +0000)]
t/v1-add-remove-add: quiet down "git init"
Use the "-q" flag like everywhere else.
Eric Wong [Sun, 24 Nov 2019 00:22:22 +0000 (00:22 +0000)]
tests: use strict everywhere
The "strict" pragma makes code easier to debug, and we had
undeclared variables as a result in t/watch_maildir_v2.t.
So use it everywhere to be consistent with the rest of our
code.
Eric Wong [Sun, 24 Nov 2019 00:22:21 +0000 (00:22 +0000)]
tests: disable daemon workers in a few more places
There were still a few places where we used worker processes
unnecessarily in tests, causing a small amount of unnecessary
overhead.
Followup-to: ad221e9b2852f6c5 ("t/*.t: disable nntpd/httpd worker processes in most tests")
Eric Wong [Sun, 24 Nov 2019 03:19:42 +0000 (03:19 +0000)]
mboxgz: fix compiler parse error under under Perl 5.16.3
Perl 5.16.3 (and possibly older versions) fails with the
following errors (from CentOS7):
Use of ?PATTERN? without explicit operator is deprecated
Search pattern not terminated
Eric Wong [Sun, 24 Nov 2019 03:12:37 +0000 (03:12 +0000)]
check for File::Temp 0.19 for ->newdir method
This is distributed with Perl 5.10.1 and onwards, so it should
not be an installation burden for any users. I'm planning to
move away from tempdir() entirely and use File::Temp->newdir to
remove dependencies on END{} blocks.
Eric Wong [Fri, 15 Nov 2019 09:50:59 +0000 (09:50 +0000)]
t/xcpdb-reshard: use run_script for -xcpdb
This more than doubles the speed of the test, since we make
many invocations of -xcpdb.
Eric Wong [Fri, 15 Nov 2019 09:50:58 +0000 (09:50 +0000)]
t/indexlevels-mirror*: switch to run_script
This more than doubles the speed of these tests
Eric Wong [Fri, 15 Nov 2019 09:50:57 +0000 (09:50 +0000)]
t/v2mda: switch to run_script in many places
This more than doubles the speed of the test.
Eric Wong [Fri, 15 Nov 2019 09:50:56 +0000 (09:50 +0000)]
t/watch_filter_rubylang: run_script for -init and -index
This nets us a 20% speedup or so.
Eric Wong [Fri, 15 Nov 2019 09:50:55 +0000 (09:50 +0000)]
t/nntpd: use run_script for -init
This only gives a 5% speedup or so, but anything helps.
Eric Wong [Fri, 15 Nov 2019 09:50:54 +0000 (09:50 +0000)]
t/watch_maildir_v2: use run_script for -init
This only gives a small 10% speedup or so, but anything helps.
Eric Wong [Fri, 15 Nov 2019 09:50:53 +0000 (09:50 +0000)]
t/httpd: use run_script for -init
This only gives a small ~10% speedup, since -httpd still
needs execve, but any speedup is welcome.
Eric Wong [Fri, 15 Nov 2019 09:50:52 +0000 (09:50 +0000)]
t/convert-compact: convert to run_script
While this didn't use IPC::Run, having to reload several Perl
modules and scripts is slow and inefficient, so roughly
double the speed of this test.
Eric Wong [Fri, 15 Nov 2019 09:50:51 +0000 (09:50 +0000)]
t/v2mirror: switch to default run_mode for speedup
We need to be careful and explicitly close FDs before doing
-index, since we can't rely on FD_CLOEXEC without execve(2)
syscalls.
Eric Wong [Fri, 15 Nov 2019 09:50:50 +0000 (09:50 +0000)]
doc: remove IPC::Run as a dev and test dependency
It's no longer needed and we're able to speed up some
of our tests as a result.
Eric Wong [Fri, 15 Nov 2019 09:50:49 +0000 (09:50 +0000)]
t/mda_filter_rubylang: drop IPC::Run dependency
This test runs more than twice as fast, now.
Eric Wong [Fri, 15 Nov 2019 09:50:48 +0000 (09:50 +0000)]
t/mda: switch to run_script for testing
Another noticeable speedup, this test is roughly ~3x faster now.
Eric Wong [Fri, 15 Nov 2019 09:50:47 +0000 (09:50 +0000)]
t/v2mirror: get rid of IPC::Run dependency
Not taking advantage of faster run modes in run_script, yet
since some lifetime problems need to be sorted.
Eric Wong [Fri, 15 Nov 2019 09:50:46 +0000 (09:50 +0000)]
t/purge: convert to run_script
This nets us another sizeable speedup.
Eric Wong [Fri, 15 Nov 2019 09:50:45 +0000 (09:50 +0000)]
t/init: convert to using run_script
This gives a 2-3x speedup on the test with the default
run_mode=1.
Eric Wong [Fri, 15 Nov 2019 09:50:44 +0000 (09:50 +0000)]
t/edit: switch to use run_script
Perl parsing is slow, and run_script default behavior allows
this to speed up t/edit.t by over 100% in my case.
Eric Wong [Fri, 15 Nov 2019 09:50:43 +0000 (09:50 +0000)]
t/common: introduce run_script wrapper for t/cgi.t
This will give us a consistent interface for running
test scripts in more performant ways while still giving
us a consistent interface to recreate real-world behavior
via spawn() (fork + execve), if needed.
The default run_mode (1) is faster and can run within the test
process with some minor adjustments to our code to avoid global
state.
This avoids the significante overhead of Perl code loading,
parsing and compilation phases.
Eric Wong [Fri, 15 Nov 2019 09:50:42 +0000 (09:50 +0000)]
spawn: which: allow embedded slash for relative path
This makes the subroutine behave more like which(1) command
and will make using spawn() in tests easier.
Eric Wong [Fri, 15 Nov 2019 09:50:41 +0000 (09:50 +0000)]
xapcmd: do not fire END and DESTROY handlers in child
We need to bypass whatever Test::More does with END/DESTROY
handlers for use in lon-lived process. This doesn't affect
any of our normal code since we don't use END/DESTROY for
Xapcmd and its callers.
Eric Wong [Fri, 15 Nov 2019 09:50:40 +0000 (09:50 +0000)]
import: only pass Inbox object to SearchIdx->new
SearchIdx->new no longer accepts a GIT_DIR path as its argument
since commit
585314673236d664729fe3ab2d4fb229d1c0f2d5
("searchidx: require PublicInbox::Inbox (or InboxWritable) ref")
Eric Wong [Fri, 15 Nov 2019 09:50:39 +0000 (09:50 +0000)]
inboxwritable: add ->cleanup method
We've been using this in -edit, and will be using it in some
more scripts and tests to optimize for run_mode=2 with
run_script.
Keeping this in the *Writable modules since I don't see it being
useful for the WWW and NNTP read-only interfaces which use
PublicInbox::Inbox.
Eric Wong [Fri, 15 Nov 2019 09:50:38 +0000 (09:50 +0000)]
learn: pass global variables into subs
Avoid 'Variable "%s" will not stay shared' warnings
when the contents of this script eval'ed into a sub.
Eric Wong [Fri, 15 Nov 2019 09:50:37 +0000 (09:50 +0000)]
mda: pass global variables into subs
Avoid 'Variable "%s" will not stay shared' warnings
when the contents of this script eval'ed into a sub.
Eric Wong [Fri, 15 Nov 2019 09:50:36 +0000 (09:50 +0000)]
init: pass global variables into subs
Avoid 'Variable "%s" will not stay shared' warnings
when the contents of this script eval'ed into a sub.
We also need to rely on ->DESTROY instead of END{}
to unlink the lock file on sub exit.
Eric Wong [Fri, 15 Nov 2019 09:50:35 +0000 (09:50 +0000)]
index: pass global variables into subs
Avoid 'Variable "%s" will not stay shared' warnings
when the contents of this script eval'ed into a sub.