From 4db8d0b9edc1a70a7d2cf1b850efb13a57b4817d Mon Sep 17 00:00:00 2001 From: Hazelnoot Date: Sat, 27 Sep 2025 19:59:56 -0400 Subject: [PATCH] make sure GlobalModule.dispose always completes --- packages/backend/src/GlobalModule.ts | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/packages/backend/src/GlobalModule.ts b/packages/backend/src/GlobalModule.ts index d0fb934e63..b07d68b90d 100644 --- a/packages/backend/src/GlobalModule.ts +++ b/packages/backend/src/GlobalModule.ts @@ -8,6 +8,8 @@ import * as Redis from 'ioredis'; import { DataSource } from 'typeorm'; import { MeiliSearch } from 'meilisearch'; import { MiMeta } from '@/models/Meta.js'; +import { bindThis } from '@/decorators.js'; +import { renderInlineError } from '@/misc/render-inline-error.js'; import { DI } from './di-symbols.js'; import { Config, loadConfig } from './config.js'; import { createPostgresDataSource } from './postgres.js'; @@ -189,12 +191,12 @@ export class GlobalModule implements OnApplicationShutdown { // And then disconnect from DB this.logger.info('Disconnected from data sources...'); await this.db.destroy(); - this.redisClient.disconnect(); - this.redisForPub.disconnect(); - this.redisForSub.disconnect(); - this.redisForTimelines.disconnect(); - this.redisForReactions.disconnect(); - this.redisForRateLimit.disconnect(); + this.safeDisconnect(this.redisClient); + this.safeDisconnect(this.redisForPub); + this.safeDisconnect(this.redisForSub); + this.safeDisconnect(this.redisForTimelines); + this.safeDisconnect(this.redisForReactions); + this.safeDisconnect(this.redisForRateLimit); this.logger.info('Global module disposed.'); } @@ -202,4 +204,12 @@ export class GlobalModule implements OnApplicationShutdown { async onApplicationShutdown(signal: string): Promise { await this.dispose(); } + + private safeDisconnect(redis: { disconnect(): void }): void { + try { + redis.disconnect(); + } catch (err) { + this.logger.error(`Unhandled error disconnecting redis: ${renderInlineError(err)}`); + } + } }