From 9448c9621dec72eb79e38846696b9505ee2594cb Mon Sep 17 00:00:00 2001 From: Matteo Collina Date: Mon, 3 Aug 2026 13:43:52 +0000 Subject: [PATCH 1/2] test(h2): isolate connection churn seeds Signed-off-by: Matteo Collina --- test/http2-request-never-settles.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/test/http2-request-never-settles.js b/test/http2-request-never-settles.js index a5c2056473f..994332f092a 100644 --- a/test/http2-request-never-settles.js +++ b/test/http2-request-never-settles.js @@ -1,7 +1,7 @@ 'use strict' const assert = require('node:assert') -const { test, after } = require('node:test') +const { test } = require('node:test') const { constants, createSecureServer } = require('node:http2') const { once } = require('node:events') const { Readable } = require('node:stream') @@ -115,7 +115,7 @@ async function churningServer (rnd) { } for (const seed of SEEDS) { - test(`every h2 request settles under connection churn (seed ${seed})`, async () => { + test(`every h2 request settles under connection churn (seed ${seed})`, async (t) => { const timer = setInterval(() => {}, 1000) const rnd = makeRandom(seed) const server = await churningServer(rnd) @@ -127,10 +127,16 @@ for (const seed of SEEDS) { headersTimeout: 500, bodyTimeout: 500 }) - after(async () => { - await agent.destroy() - server.shutdown() - clearInterval(timer) + // Release each seed's resources before the next test starts. A file-level + // after hook kept every TLS server and keepalive timer until all seeds had + // finished, making this churn test sensitive to CI load. + t.after(async () => { + try { + await agent.destroy() + } finally { + server.shutdown() + clearInterval(timer) + } }) const unsettled = [] From fa9e6822c96f7d4fadb42c69af4c0b44246145fa Mon Sep 17 00:00:00 2001 From: Matteo Collina Date: Fri, 7 Aug 2026 23:32:53 +0200 Subject: [PATCH 2/2] test(h2): skip churn test on Node.js 24 Node.js 24 has an HTTP/2 memory corruption bug that can crash this stress test before its assertions run. Signed-off-by: Matteo Collina --- test/http2-request-never-settles.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/http2-request-never-settles.js b/test/http2-request-never-settles.js index 994332f092a..076839280cf 100644 --- a/test/http2-request-never-settles.js +++ b/test/http2-request-never-settles.js @@ -10,6 +10,8 @@ const pem = require('@metcoder95/https-pem') const { Agent } = require('..') +const skipOnNode24 = Number(process.versions.node.split('.')[0]) === 24 + // completeRequestStream() runs on an h2 stream's 'close': // // releaseRequestStream(this) @@ -115,7 +117,9 @@ async function churningServer (rnd) { } for (const seed of SEEDS) { - test(`every h2 request settles under connection churn (seed ${seed})`, async (t) => { + test(`every h2 request settles under connection churn (seed ${seed})`, { + skip: skipOnNode24 && 'Node.js 24 has an HTTP/2 memory corruption bug' + }, async (t) => { const timer = setInterval(() => {}, 1000) const rnd = makeRandom(seed) const server = await churningServer(rnd)