You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Wisp v0.5.1 segfaults (signal 11 / SIGSEGV) roughly 2.5 hours into normal operation behind the StartOS reverse proxy. StartOS catches the dead child, fails the primary health check, and auto-restarts the daemon (recovery works), but the relay drops all live connections each time.
The sync.rs:794 location is the StartOS supervisor reporting the child's exit signal, not the fault site. The fault is inside the wisp binary.
Triage
Not the spider.configure-spider/getInput confirms enabled: false, so the known upstream spider read-loop crashes ([BUG] wisp core dumped on initial sync wisp#104, #100) are ruled out — that code path does not run.
Not the XFF/trust_proxy code. Reviewed extractClientIp / normalizeIp / bucketKey in wisp v0.5.1: bounds-checked slice ops and bufPrint (the IPv6 /64 key fits its [19]u8 exactly), and the WS path @memcpys the IP out before the request buffer is freed. (Also moot — current master seeds max_connections_per_ip: 100000 and does not set trust_proxy.)
Not OOM. An OOM kill is signal 9; this is signal 11 — a genuine memory-safety fault.
Leading suspect: the inbound httpz websocket read path — the one area v0.5.1 churned (httpz repin, Re-pin httpz to the simplified websocket lost-read fix wisp#98 "websocket lost-read/reorder fix"). Fits the signature: clean start, segfault hours into live client traffic.
Why there is no stack trace
The package builds wisp with -Doptimize=ReleaseFast (Dockerfile:41), which strips safety checks and the panic trace, so StartOS can only surface a bare signal 11. We cannot pin the exact fault line from these logs.
Proposed next step
Build wisp ReleaseSafe so the next fault emits a Zig panic with file:line (as in privkeyio/wisp#104) instead of an opaque SIGSEGV; then file an upstream wisp bug with the trace. Optionally enable core dumps for a backtrace.
Notes
Package pins v0.5.0 (Dockerfile:29) but the crashing instance runs v0.5.1 — reconcile.
Reproducible ~2.5h into steady inbound traffic, spider disabled.
Summary
Wisp v0.5.1 segfaults (
signal 11 / SIGSEGV) roughly 2.5 hours into normal operation behind the StartOS reverse proxy. StartOS catches the dead child, fails theprimaryhealth check, and auto-restarts the daemon (recovery works), but the relay drops all live connections each time.Observed
The
sync.rs:794location is the StartOS supervisor reporting the child's exit signal, not the fault site. The fault is inside the wisp binary.Triage
configure-spider/getInputconfirmsenabled: false, so the known upstream spider read-loop crashes ([BUG] wisp core dumped on initial sync wisp#104, #100) are ruled out — that code path does not run.trust_proxycode. ReviewedextractClientIp/normalizeIp/bucketKeyin wisp v0.5.1: bounds-checked slice ops andbufPrint(the IPv6/64key fits its[19]u8exactly), and the WS path@memcpys the IP out before the request buffer is freed. (Also moot — current master seedsmax_connections_per_ip: 100000and does not settrust_proxy.)Why there is no stack trace
The package builds wisp with
-Doptimize=ReleaseFast(Dockerfile:41), which strips safety checks and the panic trace, so StartOS can only surface a baresignal 11. We cannot pin the exact fault line from these logs.Proposed next step
Build wisp
ReleaseSafeso the next fault emits a Zig panic withfile:line(as in privkeyio/wisp#104) instead of an opaque SIGSEGV; then file an upstream wisp bug with the trace. Optionally enable core dumps for a backtrace.Notes
Dockerfile:29) but the crashing instance runs v0.5.1 — reconcile.