From e9be05438cc85eec16df0df7dacd987a70a14e57 Mon Sep 17 00:00:00 2001 From: bcoll Date: Wed, 24 May 2023 12:48:11 +0100 Subject: [PATCH] Make process exits/server stops more aggressive to prevent test hangs --- packages/miniflare/src/index.ts | 9 +++++---- packages/miniflare/src/runtime/index.ts | 10 +++------- packages/miniflare/test/test-shared/http.ts | 9 +++++++-- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/packages/miniflare/src/index.ts b/packages/miniflare/src/index.ts index 68ebd88f7..17b242d63 100644 --- a/packages/miniflare/src/index.ts +++ b/packages/miniflare/src/index.ts @@ -465,9 +465,7 @@ export class Miniflare { verbose: this.#sharedOpts.core.verbose, }; this.#runtime = new Runtime(opts); - this.#removeRuntimeExitHook = exitHook( - () => void this.#runtime?.dispose(/* force */ true) - ); + this.#removeRuntimeExitHook = exitHook(() => void this.#runtime?.dispose()); // Update config and wait for runtime to start await this.#assembleAndUpdateConfig(/* initial */ true); @@ -673,7 +671,10 @@ export class Miniflare { hostname?: string ): Promise { return new Promise((resolve) => { - const server = stoppable(http.createServer(this.#handleLoopback)); + const server = stoppable( + http.createServer(this.#handleLoopback), + /* grace */ 0 + ); server.on("upgrade", this.#handleLoopbackUpgrade); server.listen(port as any, hostname, () => resolve(server)); }); diff --git a/packages/miniflare/src/runtime/index.ts b/packages/miniflare/src/runtime/index.ts index 219c8a162..b03bcfaf4 100644 --- a/packages/miniflare/src/runtime/index.ts +++ b/packages/miniflare/src/runtime/index.ts @@ -130,18 +130,14 @@ export class Runtime { return waitForPort(SOCKET_ENTRY, controlPipe, options); } - get exitPromise(): Promise | undefined { - return this.#processExitPromise; - } - - dispose(force = false): Awaitable { + dispose(): Awaitable { // `kill()` uses `SIGTERM` by default. In `workerd`, this waits for HTTP // connections to close before exiting. Notably, Chrome sometimes keeps // connections open for about 10s, blocking exit. We'd like `dispose()`/ // `setOptions()` to immediately terminate the existing process. - // Therefore, use `SIGINT` which force closes all connections. + // Therefore, use `SIGKILL` which force closes all connections. // See https://github.com/cloudflare/workerd/pull/244. - this.#process?.kill(force ? "SIGKILL" : "SIGINT"); + this.#process?.kill("SIGKILL"); return this.#processExitPromise; } } diff --git a/packages/miniflare/test/test-shared/http.ts b/packages/miniflare/test/test-shared/http.ts index 4b3a1da51..60b4f8e07 100644 --- a/packages/miniflare/test/test-shared/http.ts +++ b/packages/miniflare/test/test-shared/http.ts @@ -2,6 +2,7 @@ import http from "http"; import { AddressInfo } from "net"; import { URL } from "url"; import { ExecutionContext } from "ava"; +import stoppable from "stoppable"; import NodeWebSocket, { WebSocketServer } from "ws"; export async function useServer( @@ -10,7 +11,7 @@ export async function useServer( webSocketListener?: (socket: NodeWebSocket, req: http.IncomingMessage) => void ): Promise<{ http: URL; ws: URL }> { return new Promise((resolve) => { - const server = http.createServer(listener); + const server = stoppable(http.createServer(listener), /* grace */ 0); // Only setup web socket server if listener provided if (webSocketListener) { const wss = new WebSocketServer({ server }); @@ -18,7 +19,11 @@ export async function useServer( } // 0 binds to random unused port server.listen(0, () => { - t.teardown(() => server.close()); + t.teardown(() => { + return new Promise((resolve, reject) => + server.stop((err) => (err ? reject(err) : resolve())) + ); + }); const port = (server.address() as AddressInfo).port; resolve({ http: new URL(`http://localhost:${port}`),