{"record":{"id":"3d2926b9dc8f61c1","repo":"oven-sh/bun","slug":"s-s-w-d-s-s-n","errorCode":null,"errorMessage":"  %s%s w%d%s %s\\n","messagePattern":"  %s%s w%d%s %s\\\\n","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"packages/h3blast/src/h3blast.c","lineNumber":1276,"sourceCode":"            prev = cur;\n\n            if (g_stop) break;\n            if (cfg.duration_s > 0 && elapsed >= run_for) { g_stop = 1; break; }\n            if (cfg.max_requests && cur.done >= cfg.max_requests) { g_stop = 1; break; }\n            if (cur.hsk_fail >= (uint64_t)cfg.connections && cur.done == 0 && elapsed > 1) { g_stop = 1; break; }\n        }\n\n        for (int i = 0; i < nw; i++) pthread_join(ws[i].thread, NULL);\n\n        struct result *r = &results[t];\n        r->ran = true;\n        r->elapsed = (double)(now_ns() - stats_start) / 1e9;\n        collect(ws, nw, &r->snap);\n        hdr_init(1, 60 * 1000 * 1000, 3, &r->hist);\n        for (int i = 0; i < nw; i++) {\n            if (ws[i].hist) { hdr_add(r->hist, ws[i].hist); hdr_close(ws[i].hist); }\n            if (ws[i].errbuf[0])\n                fprintf(stderr, \"  %s%s w%d%s %s\\n\", RED, cfg.targets[t].label, i, RST, ws[i].errbuf);\n        }\n    }\n\n    if (g_isatty && !cfg.quiet) {\n        if (g_live_lines) fprintf(stderr, \"\\r\\x1b[%dA\\x1b[J\", g_live_lines);\n        fputs(\"\\x1b[?7h\\x1b[?25h\", stderr);\n    }\n\n    render_final(&cfg, results);\n\n    lsquic_global_cleanup();\n    uint64_t done = 0;\n    for (int t = 0; t < nt; t++) done += results[t].snap.done;\n    return (done == 0) ? 1 : 0;\n}\n","sourceCodeStart":1258,"sourceCodeEnd":1292,"githubUrl":"https://github.com/oven-sh/bun/blob/8c5296ac459e8252d3cd702f3fbcbb0c249d95d5/packages/h3blast/src/h3blast.c#L1258-L1292","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// pre-flight: one quick request per target before the real benchmark\nconst r = spawnSync(h3blastPath, ['-c', '1', '-d', '1', target], { encoding: 'utf8' });\nif (r.status !== 0) throw new Error(`target unreachable: ${target}`);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["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"],"tags":["benchmark","http3","network","diagnostics"],"backgroundTag":null,"analyzedSha":"8c5296ac459e8252d3cd702f3fbcbb0c249d95d5","analyzedAt":"2026-08-16T08:01:58.794Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}