oven-sh/bun · warning
%s%s w%d%s %s\n
Error message
%s%s w%d%s %s\n
What it means
After each target's run, h3blast prints one line per worker that accumulated errors in its errbuf, formatted ' <red><label> w<index><rst> <errors>'. This is non-fatal diagnostics: the benchmark completed, but some of that target's workers hit per-connection failures (connect refused, TLS/QUIC handshake failures, stream errors) recorded in the buffer.
Source
Thrown at packages/h3blast/src/h3blast.c:1276
prev = cur;
if (g_stop) break;
if (cfg.duration_s > 0 && elapsed >= run_for) { g_stop = 1; break; }
if (cfg.max_requests && cur.done >= cfg.max_requests) { g_stop = 1; break; }
if (cur.hsk_fail >= (uint64_t)cfg.connections && cur.done == 0 && elapsed > 1) { g_stop = 1; break; }
}
for (int i = 0; i < nw; i++) pthread_join(ws[i].thread, NULL);
struct result *r = &results[t];
r->ran = true;
r->elapsed = (double)(now_ns() - stats_start) / 1e9;
collect(ws, nw, &r->snap);
hdr_init(1, 60 * 1000 * 1000, 3, &r->hist);
for (int i = 0; i < nw; i++) {
if (ws[i].hist) { hdr_add(r->hist, ws[i].hist); hdr_close(ws[i].hist); }
if (ws[i].errbuf[0])
fprintf(stderr, " %s%s w%d%s %s\n", RED, cfg.targets[t].label, i, RST, ws[i].errbuf);
}
}
if (g_isatty && !cfg.quiet) {
if (g_live_lines) fprintf(stderr, "\r\x1b[%dA\x1b[J", g_live_lines);
fputs("\x1b[?7h\x1b[?25h", stderr);
}
render_final(&cfg, results);
lsquic_global_cleanup();
uint64_t done = 0;
for (int t = 0; t < nt; t++) done += results[t].snap.done;
return (done == 0) ? 1 : 0;
}
View on GitHub (pinned to 8c5296ac45)
Solutions
- Read the errbuf text on the line — it names the concrete worker-level failure
- Do a 1-connection smoke run against the target before the full benchmark to catch reachability/cert issues
- Lower concurrency or duration if the target is refusing connections under load
- Verify UDP/443 reachability and that the target actually speaks HTTP/3
Defensive patterns
Strategy: validation
Validate before calling
// pre-flight: one quick request per target before the real benchmark
const r = spawnSync(h3blastPath, ['-c', '1', '-d', '1', target], { encoding: 'utf8' });
if (r.status !== 0) throw new Error(`target unreachable: ${target}`); Prevention
- Confirm UDP/443 and HTTP/3 reachability of each target before load runs
- Check cert/ALPN config when handshake errors dominate the errbuf lines
- Scale concurrency up gradually to find the target's accept limits
When it happens
Trigger: A target that is down or refusing UDP/QUIC; certificate mismatches causing handshake_fail counters; transient packet loss or conn-limit exhaustion on some workers while others succeed.
Common situations: Load-testing a server that is restarting or rate-limiting; ALPN/cert misconfig between client and target; firing more connections than the target's accept queue handles.
Related errors
- openssl failed: ${stderr}
- %s%serror%s
- page-cache eviction failed for ${path}; results would be war
- not called
- Second buffer was modified
AI-assisted analysis of oven-sh/bun@8c5296ac45 (2026-08-16).
Data as JSON: /api/errors/3d2926b9dc8f61c1.
Report an issue: GitHub.