SIGTERM could close browser before parent, resulting in race

- SIGTERM is no longer handled by puppeteer
This commit is contained in:
Iain Sproat
2025-03-27 17:13:49 +00:00
parent 3c753b5609
commit 0caaa7a264
+21 -5
View File
@@ -67,6 +67,7 @@ const jobQueue = new Bull('preview-service-jobs', opts)
// store this callback, so on shutdown we can error the job
let currentJob: { logger: Logger; done: Bull.DoneCallback } | undefined = undefined
let browser: Browser | undefined = undefined
const server = app.listen(port, host, async () => {
logger.info({ port }, '📡 Started Preview Service server, listening on {port}')
@@ -81,15 +82,27 @@ const server = app.listen(port, host, async () => {
// we trust the web content that is running, so can disable the sandbox
// disabling the sandbox allows us to run the docker image without linux kernel privileges
args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage'],
protocolTimeout: PREVIEW_TIMEOUT
protocolTimeout: PREVIEW_TIMEOUT,
handleSIGHUP: false, // handle closing of the browser by the parent process
handleSIGINT: false, // handle closing of the browser by the parent process
handleSIGTERM: false // handle closing of the browser by the parent process
})
}
logger.debug('Starting message queues')
// nothing after this line is getting called, this blocks
await jobQueue.process(async (payload, done) => {
let jobLogger = logger.child({ payloadId: payload.id })
let browser: Browser | undefined = undefined
let jobLogger = logger.child({
payloadId: payload.id,
jobPriorAttemptsMade: payload.attemptsMade
})
if (browser) {
const message = 'Starting job but Browser is already open.'
done(new Error(message))
throw new Error(message)
}
try {
currentJob = { done, logger: jobLogger }
const parseResult = jobPayload.safeParse(payload.data)
@@ -104,7 +117,6 @@ const server = app.listen(port, host, async () => {
const job = parseResult.data
jobLogger = jobLogger.child({
jobId: job.jobId,
jobPriorAttemptsMade: payload.attemptsMade,
serverUrl: job.url
})
const resultsQueue = new Bull(job.responseQueue, opts)
@@ -140,8 +152,8 @@ const server = app.listen(port, host, async () => {
} finally {
if (browser) await browser.close()
browser = undefined
currentJob = undefined
}
currentJob = undefined
})
})
@@ -158,6 +170,10 @@ const beforeShutdown = async () => {
currentJob.logger.warn('Cancelling job due to preview-service shutdown')
currentJob.done(new Error('Job cancelled due to preview-service shutdown'))
}
if (browser) {
await browser.close()
browser = undefined
}
}
const onShutdown = async () => {