fix(preview service): handle shutdown via terminus
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user