Revision history for Hyperman
0.03 2026-08-01
- TLS: build against pre-1.1.0 OpenSSL. Older releases lack
OPENSSL_init_ssl(), the OPENSSL_INIT_LOAD_*_STRINGS constants,
TLS_server_method(), and SSL_CTX_set_min_proto_version(); provide
a compatibility shim (SSL_library_init + SSLv23_server_method +
SSL_OP_NO_* protocol fencing) so hm_tls.h compiles instead of
failing with undeclared-identifier errors on those hosts. Also map
SSL_get1_peer_certificate to SSL_get_peer_certificate before 3.0.
- Makefile.PL: bail out cleanly (NA, not FAIL) on native Windows.
Hyperman needs fork, POSIX signals, sockets, sys/uio, and a
kqueue/epoll/io_uring/poll backend, none of which MSWin32/MinGW
provides (the build previously died on a missing <sys/uio.h>).
- t/14-prod.t: bound the respawn/recycle/stats polls by wall-clock
time instead of fixed iteration counts. A -9'd worker is respawned
with exponential backoff, so on loaded smokers the replacement can
lag; the fixed windows produced intermittent failures on the
"request counter advanced" and "supervisor respawned a replacement
worker" assertions.
0.02 2026-08-01
- io_uring backend: assign sqe->user_data directly instead of calling
io_uring_sqe_set_data64(), which only exists in liburing >= 2.2 and
left the .so with an undefined symbol on hosts with older liburing.
- Supervisor: close a signal lost-wakeup race. The pool loop now keeps
TERM/INT/HUP/USR1/USR2/CHLD blocked, reaps with WNOHANG, and waits
via sigsuspend(), so a USR1 stats dump (or any signal) arriving while
the pool is idle is serviced immediately instead of stalling until a
worker happened to exit. Fixes intermittent t/15-process.t failures.
0.01 2026-07-31
First release.
- Event-loop PSGI server: prefork supervisor + per-worker XS loop.
Passes the full Plack::Test::Suite; runs any Plack app via
`plackup -s Hyperman`.
- Pluggable readiness backends behind one C vtable: kqueue
(macOS/BSD), epoll (Linux), portable poll fallback, and an opt-in
io_uring backend (raw syscalls, poll-mode ring). Selection is
automatic; force with HYPERMAN_BACKEND.
- Hyperman::Future: native XS array-slot Future-compatible async
result. Handlers may return a Future (or any on_ready-compatible
object, e.g. CPAN Future) of the PSGI response; get/await pump the
worker's own loop re-entrantly.
- Async PSGI: psgi.streaming/delayed responder with a streaming
writer, psgix.io (dup'd client socket), psgix.loop, cancellation
of the response Future on client disconnect, timer and io_ready
Futures on the loop.
- Production: worker respawn with crash-loop throttle, SIGHUP
zero-downtime worker recycle, graceful TERM/INT drain, idle and
slow-request timeouts, pipelining fairness cap, request size
ceiling with 413, opt-in SO_REUSEPORT per-worker listeners
(Linux), access_log callback, Hyperman->stats.