fix(preview service): handle shutdown via terminus

This commit is contained in:
Iain Sproat
2025-03-12 09:28:38 +00:00
parent d2067f7e48
commit 5804ee4b50
4 changed files with 33 additions and 14 deletions
+1
View File
@@ -27,6 +27,7 @@
"build": "tsc -p ./tsconfig.build.json"
},
"dependencies": {
"@godaddy/terminus": "^4.12.1",
"@speckle/shared": "workspace:^",
"bull": "^4.16.4",
"dotenv": "^16.4.7",
+21 -13
View File
@@ -15,6 +15,7 @@ import { jobProcessor } from '@/jobProcessor.js'
import { Redis, RedisOptions } from 'ioredis'
import { jobPayload } from '@speckle/shared/dist/esm/previews/job.js'
import { initMetrics, initPrometheusRegistry } from '@/metrics.js'
import { createTerminus } from '@godaddy/terminus'
const app = express()
const host = HOST
@@ -122,25 +123,32 @@ const server = app.listen(port, host, async () => {
})
})
const shutdown = async () => {
// stop accepting new jobs
const beforeShutdown = async () => {
logger.info('🛑 Beginning shut down, pausing all jobs')
// stop accepting new jobs and kill any running jobs
await jobQueue.pause(
true, // just pausing this local worker of the queue
true // do not wait for active jobs to finish
)
// if there is a job currently running, cancell it with an error
if (jobDoneCallback) {
jobDoneCallback(new Error('Job cancelled due to perview-service shutdown'))
logger.warn('Cancelling job due to preview-service shutdown')
jobDoneCallback(new Error('Job cancelled due to preview-service shutdown'))
}
logger.info('Received signal to shut down')
server.close(() => {
logger.debug('Exiting the express server')
process.exit()
})
}
process.on('SIGINT', async () => await shutdown())
process.on('SIGQUIT', async () => await shutdown())
process.on('SIGABRT', async () => await shutdown())
const onShutdown = async () => {
logger.info('👋 Completed shut down, now exiting')
}
createTerminus(server, {
beforeShutdown,
onShutdown,
logger: (msg, err) => {
if (err) {
logger.error({ err }, msg)
return
}
logger.info(msg)
}
})
@@ -84,7 +84,7 @@ export const consumePreviewResultFactory =
switch (previewResult.status) {
case 'error':
log.error(previewMessage)
log.error({ reason: previewResult.reason }, previewMessage)
await upsertObjectPreview({
objectPreview: {
objectId,
+10
View File
@@ -10526,6 +10526,15 @@ __metadata:
languageName: node
linkType: hard
"@godaddy/terminus@npm:^4.12.1":
version: 4.12.1
resolution: "@godaddy/terminus@npm:4.12.1"
dependencies:
stoppable: "npm:^1.1.0"
checksum: 10/e1b6e0a079db5748c71211e22d2fc1ab76ee20763bb552e9e2b6003330c0b19fee10b20b1dd961218a402c6aadd3a8ecf7f03ecdfaa2c65ed072b2479eb9b517
languageName: node
linkType: hard
"@godaddy/terminus@npm:^4.9.0":
version: 4.10.2
resolution: "@godaddy/terminus@npm:4.10.2"
@@ -16752,6 +16761,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@speckle/preview-service@workspace:packages/preview-service"
dependencies:
"@godaddy/terminus": "npm:^4.12.1"
"@speckle/shared": "workspace:^"
"@swc/cli": "npm:^0.5.1"
"@swc/core": "npm:^1.9.3"