commit 4e3645e6de61b26c888bbc59e4a1c716d83c8fc7
parent efb714f76eca75dfb7ad1b5f0e27d2d87b481440
Author: Florian Dold <dold@taler.net>
Date: Mon, 14 Sep 2026 01:42:38 +0200
taler-harness: wait for socket release in worker cleanup checks
Keep port reuse bounded by the existing cleanup deadline after the
worker and service processes have exited.
Diffstat:
1 file changed, 22 insertions(+), 6 deletions(-)
diff --git a/packages/taler-harness/src/integrationtests/worker-supervisor.test.ts b/packages/taler-harness/src/integrationtests/worker-supervisor.test.ts
@@ -98,12 +98,28 @@ async function assertCleaned(root: string, name: string, workerPid: number) {
await delay(10);
assert.equal(isRunning(pid), false, "service survived cleanup");
assert.equal(isRunning(workerPid), false, "worker survived cleanup");
- const server = net.createServer();
- server.listen(port, "127.0.0.1");
- await once(server, "listening");
- await new Promise<void>((resolve, reject) =>
- server.close((error) => (error ? reject(error) : resolve())),
- );
+ // Socket release can lag behind the process disappearing from /proc.
+ // Require the port to become reusable within the same cleanup deadline.
+ for (;;) {
+ const server = net.createServer();
+ server.listen(port, "127.0.0.1");
+ try {
+ await once(server, "listening");
+ } catch (error) {
+ if (
+ (error as NodeJS.ErrnoException).code !== "EADDRINUSE" ||
+ Date.now() >= deadline
+ ) {
+ throw error;
+ }
+ await delay(10);
+ continue;
+ }
+ await new Promise<void>((resolve, reject) =>
+ server.close((error) => (error ? reject(error) : resolve())),
+ );
+ break;
+ }
}
for (const name of ["fail", "rejection", "crash", "sigkill", "shell"]) {