Skip to content

Commit b7bcba1

Browse files
authored
Fix graceful shutdown to prevent deploy timeouts (#60862)
1 parent 4a7827c commit b7bcba1

File tree

1 file changed

+24
-0
lines changed

1 file changed

+24
-0
lines changed

src/frame/start-server.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,33 @@ async function startServer() {
6565

6666
process.once('SIGTERM', () => {
6767
logger.info('Received SIGTERM, beginning graceful shutdown', { pid: process.pid, port })
68+
69+
// Force-close idle keep-alive sockets so server.close() doesn't hang
70+
// waiting for them to disconnect naturally.
71+
try {
72+
server.closeIdleConnections()
73+
} catch (err) {
74+
logger.warn('closeIdleConnections failed (server may not be running)', { error: err })
75+
}
76+
6877
server.close(() => {
6978
logger.info('HTTP server closed')
7079
})
80+
81+
// If in-flight requests haven't drained within 25s, force exit.
82+
// Kubernetes sends SIGKILL at terminationGracePeriodSeconds (60s),
83+
// but the deploy controller may time out before that if an old pod
84+
// stays in "Terminating" state too long. The preStop hook sleeps 5s,
85+
// so 25s here keeps total shutdown well under the 60s grace period.
86+
setTimeout(() => {
87+
logger.warn('Graceful shutdown timed out, forcing exit')
88+
try {
89+
server.closeAllConnections()
90+
} catch (err) {
91+
logger.warn('closeAllConnections failed (server may not be running)', { error: err })
92+
}
93+
process.exit(0)
94+
}, 25_000).unref()
7195
})
7296

7397
return server

0 commit comments

Comments
 (0)