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) }