From fbdb77900a2084e4687511cf5ed7ad05af2a73a2 Mon Sep 17 00:00:00 2001 From: Kelvin Fichter Date: Wed, 30 Mar 2022 12:24:31 -0400 Subject: [PATCH] feat(cmn): hard stop on multiple exit signals Adds a new feature to BaseServiceV2 to have a service exit immediately when 3 exit signals are received. Useful when the main loop would take a long time to exit but you want the service to exit immediately. --- .changeset/fair-cows-think.md | 5 +++++ .../src/base-service/base-service-v2.ts | 21 ++++++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 .changeset/fair-cows-think.md diff --git a/.changeset/fair-cows-think.md b/.changeset/fair-cows-think.md new file mode 100644 index 0000000000000..2bf3b6198cf41 --- /dev/null +++ b/.changeset/fair-cows-think.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/common-ts': patch +--- + +Adds hard stop to BaseServiceV2 when multiple exit signals are received diff --git a/packages/common-ts/src/base-service/base-service-v2.ts b/packages/common-ts/src/base-service/base-service-v2.ts index 1041196a3fd21..764989b03ce17 100644 --- a/packages/common-ts/src/base-service/base-service-v2.ts +++ b/packages/common-ts/src/base-service/base-service-v2.ts @@ -247,11 +247,26 @@ export abstract class BaseServiceV2< this.logger = new Logger({ name: params.name }) // Gracefully handle stop signals. + const maxSignalCount = 3 + let currSignalCount = 0 const stop = async (signal: string) => { - this.logger.info(`stopping service with signal`, { signal }) - await this.stop() - process.exit(0) + // Allow exiting fast if more signals are received. + currSignalCount++ + if (currSignalCount === 1) { + this.logger.info(`stopping service with signal`, { signal }) + await this.stop() + process.exit(0) + } else if (currSignalCount >= maxSignalCount) { + this.logger.info(`performing hard stop`) + process.exit(0) + } else { + this.logger.info( + `send ${maxSignalCount - currSignalCount} more signal(s) to hard stop` + ) + } } + + // Handle stop signals. process.on('SIGTERM', stop) process.on('SIGINT', stop) }