about summary refs log tree commit homepage
DateCommit message (Collapse)
2019-09-20wwwatomstream: fix per-feed <id>
We were emitting the same "<id>mailto:name@domain</id>" tag for every feed (but not per-feed entry). This could cause feed readers to mistake the top (news.atom) feed for other feeds (search results, or per-thread feeds). This is technically a breaking change for people relying on per-thread or per-query feeds, but the only alternative is to remain broken for anybody trying to follow multiple feeds off the same inbox.
2019-09-18config: boolean handling matches git-config(1)
We need to handle arbitrary integers and case-insensitive variations of human words to match git-config(1) behavior, since that's what users would expect given we use config files parseable by git-config(1).
2019-09-18doc: add release notes directory
The v1.2.0 is a work-in-progress, while the others are copied out of our mail archives. Eventually, a NEWS file will be generated from these emails and distributed in the release tarball. There'll also be an Atom feed for the website reusing our feed generation code.
2019-09-17t/httpd-corner.t: don't fail lsof test if stdin is a pipe (try #2)
Actually do the redirect properly
2019-09-17t/httpd-corner.t: don't fail lsof test if stdin is a pipe
We don't want the stdin from the test runner to accidentally cause this test to fail.
2019-09-17http: remove unnecessary delete
Only removing $http->{env} is needed to prevent circular references. $env->{'psgix.io'} does not need to be deleted since $env will no longer have any references to it when ->close returns.
2019-09-17http: drop unused `$env' variable after delete
And explain why we need to do that delete in a comment.
2019-09-17qspawn: improve variable naming and commenting
Naming $start_cb consistently helps avoid confusing new readers, and some comments will help with understanding flow
2019-09-17qspawn: shorten lifetime of circular references
All of these circular references are designed to clear themselves, but these will make actual errors from Devel::Cycle easier-to-spot. The circular reference in the limiter {run_queue} is not a real problem, but we can avoid storing the circular reference until we actually need to spawn the child, reducing the size of the Qspawn object while it's in the queue, slightly. We also do not need to have redundant checks to spawn new processes, we should only spawn new processes when they're ->start-ed or after waitpid reaps them.
2019-09-17qspawn: log errors for generic PSGI server users
Generic PSGI servers have $env->{'psgi.errors'}, too, so ensure they can log errors.
2019-09-17qspawn: remove return value from ->finish
We don't use the return value in real code since we do waitpid asynchronously, now. So simplify our runtime code at the cost of making our test slighly more complex.
2019-09-15doc: update config manpage for "publicinbox.grokmanifest"
It's a bit of an esoteric option, but maybe somebody out there can find it useful.
2019-09-15qspawn: shorten lifetime of environ and opts args
We don't need to hold onto the subprocess environ and redirects/options for popen_rd after spawning the child process. I do not expect this to fix problem of leaking unlinked regular file descriptors (which I still can't reproduce), and it definitely does not fix the problem of leaking pipe descriptors (which I also can't reproduce). This will save an FD sooner on non-public-inbox-httpd servers which give a non-FD $env->{'psgi.input'}, however Regardless, it's good to free up memory resources in our own process ASAP we're done using them.
2019-09-15qspawn: clarify and improve error handling
EINTR should not happen when using non-blocking sockets like we do in our daemons, but maybe some OSes allow it to happen and edge-triggered notifications won't notify us again. So always retry immediately on EINTR without relying on kqueue or epoll to notify us, and log any other unrecoverable errors which may happen while we're at it.
2019-09-15t/httpd-corner: use which() sub for detecting curl(1)
We already import `which' for lsof(8), so we might as well use it to detect curl(1), too.
2019-09-14doc: update nntpd with NNTPS and STARTTLS examples
NNTPS and STARTTLS seems to be working for several months without incident on news.public-inbox.org, so consider it a success and maybe others can try using it. HTTPS technically works, too, but isn't documented at the moment since I can't recommend production deployments without varnish protecting it.
2019-09-14t/httpd-corner: check for leaking FDs and pipes
-W0 (no workers) should not create any pipes on its own, and we shouldn't have any deleted FDs if no clients are connected. This can find if leaks which may be triggered by PublicInbox::HTTP (and not Qspawn or GitHTTPBackend).
2019-09-14qspawn: remove unused WNOHANG import
We rely on DS to do waitpid with WNOHANG, now, and the non-DS code path won't use WNOHANG.
2019-09-14httpd/async: improve naming and comments
Rename the {cleanup} field to {end}, since it's similar to END {} and is consistent with the variable in Qspawn.pm And document how certain subs get called, since we have many subs named "new" and "close".
2019-09-14githttpbackend: use REMOTE_ADDR for deleted identifier
REMOTE_HOST is not set by us (it is the reverse DNS name) of REMOTE_ADDR, and there's few better ways to kill HTTP server performance than to use standard name resolution APIs like getnameinfo(3).
2019-09-14tmpfile: support O_APPEND and use it in DS::tmpio
Might as well share some code for temporary file creation
2019-09-14tmpfile: give temporary files meaningful names
Although we always unlink temporary files, give them a meaningful name so that we can we can still make sense of the pre-unlink name when using lsof(8) or similar tools on Linux.
2019-09-14qspawn: simplify by using PerlIO::scalar
I didn't know PerlIO::scalar existed until a few months ago, but it's been distributed with Perl since 5.8 and doesn't seem to be split out into it's own package on any distro.
2019-09-14admin: warn and ignore inaccessible inboxes
For whatever reason, inbox directories can go missing temporarily or permanently. Tell the admin about them and continue on our way.
2019-09-12solvergit: don't drop update-index stdin with qspawn
It's possible for Qspawn callers to be deferred, in which case we must ensure we don't cause the temporary file used for stdin to become unref-ed and closed. This can be a problem when we exceed the default Qspawn limiter of 32 concurrent processes for "git update-index".
2019-09-09doc daemon: note the --listen directive is not always required
Users of socket activation don't need it, and hopefully other init systems support it, too.
2019-09-09doc edit: move =for comment after item
Quiets down pod2man complaining
2019-09-09run update-copyrights from gnulib for 2019
2019-09-09doc config: document indexlevel directive
It was never documented, before.
2019-09-09tests: add tcp_connect() helper
IO::Socket::INET->new is rather verbose with the options hash, extract it into a standalone sub
2019-09-08nntp: regexp always consumes rbuf if "\n" exists
We don't want to get hung into a state where we see "\n" via index(), yet cannot consume rbuf in the while loop. So tweak the regexp to ensure we always consume rbuf. I suspect this is what causes occasional 100% CPU usage of -nntpd, but reproducing it's been difficult..
2019-09-08nntp: fix redundant CRLF from "LISTGROUP GROUP RANGE"
Since Net::NNTP::listgroup doesn't support the range parameter, I had to test this manually and noticed extra CRLF were emitted.
2019-07-14nntpdeflate: reduce overhead of idle clients
We don't need to keep an empty buffer around in the common case when a client is sending us completely inflatable requests and we're able to read them in one go. This only seems to save about 2M with 10K NNTPS clients using COMPRESS, so it's not a huge win, but better than nothing.
2019-07-13TODO: remove done items, add some more
It never ends...
2019-07-13nntp: support optional [range] arg in LISTGROUP
RFC3977 6.1.2.2 LISTGROUP allows a [range] arg after [group], and supporting it allows NNTP support in neomutt to work again. Tested with NeoMutt 20170113 (1.7.2) on Debian stretch (oldstable)
2019-07-13nntp: fix LIST OVERVIEW.FMT ordering and format
RFC3977 8.4.2 mandates the order of non-standard headers to be after the first seven standard headers/metadata; so "Xref:" must appear after "Lines:"|":lines". Additionally, non-required header names must be followed by ":full". Cc: Jonathan Corbet <corbet@lwn.net> Reported-by: Urs Janßen <E1hmKBw-0008Bq-8t@akw>
2019-07-13nntpdeflate: stop relying on SUPER for ->do_read
We won't need further layering after enabling compression. So be explicit about which sub we're calling when we hit ->do_read from NNTP and eliminate the need for the comment.
2019-07-12nntp: clear local timer on idle client expiry
We need to ensure further timers can be registered if there's currently no idle clients.
2019-07-10http|nntp: avoid recursion inside ->write
In HTTP.pm, we can use the same technique NNTP.pm uses with long_response with the $long_cb callback and avoid storing $pull in the per-client structure at all. We can also reuse the same logic to push the callback into wbuf from NNTP. This does NOT introduce a new circular reference, but documents it more clearly.
2019-07-10solver: remove redundant spawn imports
We're using Qspawn, now
2019-07-08http|nntp: "use PublicInbox::DS" instead of ->import
Relying on "use" to import during BEGIN means we get to take advantage of prototype checking of function args during the rest of the compilation phase.
2019-07-08httpd: (cleanup) use reference instead of *glob
*glob notation isn't always necessary, and there's no need to disable 'once' warnings, this way.
2019-07-08daemon: use POSIX and WNOHANG more idiomatically
No point in uglifying our code since we need the POSIX module in many places, anyways.
2019-07-08Merge remote-tracking branch 'origin/nntp-compress'
* origin/nntp-compress: nntp: improve error reporting for COMPRESS nntp: reduce memory overhead of zlib nntp: support COMPRESS DEFLATE per RFC 8054 nntp: move LINE_MAX constant to the top nntp: use msg_more as a method
2019-07-08ds: use WNOHANG with waitpid if inside event loop
While we're usually not stuck waiting on waitpid after seeing a pipe EOF or even triggering SIGPIPE in the process (e.g. git-http-backend) we're reading from, it MAY happen and we should be careful to never hang the daemon process on waitpid calls. v2: use "eq" for string comparison against 'DEFAULT'
2019-07-07nntp: improve error reporting for COMPRESS
Add some checks for errors at initialization, though there's not much that can be done with ENOMEM-type errors aside from dropping clients. We can also get rid of the scary FIXME for MemLevel=8. It was a stupid error on my part in the original per-client deflate stream implementation calling C::R::Z::{Inflate,Deflate} in array context and getting the extra dualvar error code as a string result, causing the {zin}/{zout} array refs to have extra array elements.
2019-07-06nntp: reduce memory overhead of zlib
Using Z_FULL_FLUSH at the right places in our event loop, it appears we can share a single zlib deflate context across ALL clients in a process. The zlib deflate context is the biggest factor in per-client memory use, so being able to share that across many clients results in a large memory savings. With 10K idle-but-did-something NNTP clients connected to a single process on a 64-bit system, TLS+DEFLATE used around 1.8 GB of RSS before this change. It now uses around 300 MB. TLS via IO::Socket::SSL alone uses <200MB in the same situation, so the actual memory reduction is over 10x. This makes compression less efficient and bandwidth increases around 45% in informal testing, but it's far better than no compression at all. It's likely around the same level of compression gzip gives on the HTTP side. Security implications with TLS? I don't know, but I don't really care, either... public-inbox-nntpd doesn't support authentication and it's up to the client to enable compression. It's not too different than Varnish caching gzipped responses on the HTTP side and having responses go to multiple HTTPS clients.
2019-07-06nntp: support COMPRESS DEFLATE per RFC 8054
This is only tested so far with my patches to Net::NNTP at: https://rt.cpan.org/Ticket/Display.html?id=129967 Memory use in C10K situations is disappointing, but that's the nature of compression. gzip compression over HTTPS does have the advantage of not keeping zlib streams open when clients are idle, at the cost of worse compression.
2019-07-06nntp: move LINE_MAX constant to the top
It'll be accessible from other places, and there was no real point in having it declared inside a sub.
2019-07-06nntp: use msg_more as a method
It's a tad slower, but we'll be able to subclass this to rely on zlib deflate buffering. This is advantageous for TLS clients since (AFAIK) IO::Socket::SSL/OpenSSL doesn't give us ways to use MSG_MORE or writev(2) like like GNUTLS does.