diff --git a/src/Utils/auth-utils.ts b/src/Utils/auth-utils.ts index 6520d55b..1e90ec8d 100644 --- a/src/Utils/auth-utils.ts +++ b/src/Utils/auth-utils.ts @@ -342,7 +342,7 @@ export const addTransactionCapability = ( }, /** - * Cleanup all resources (queues, managers) + * Cleanup all resources (queues, managers, mutexes) * Should be called during connection cleanup */ destroy: () => { @@ -357,6 +357,12 @@ export const addTransactionCapability = ( }) keyQueues.clear() + // Clear transaction mutexes and reference counts + // CRITICAL: Prevents memory leak from accumulated mutex objects + txMutexes.clear() + txMutexRefCounts.clear() + logger.debug('Transaction mutexes cleared') + logger.debug('Transaction capability cleanup completed') } } diff --git a/src/Utils/structured-logger.ts b/src/Utils/structured-logger.ts index 6ebb997b..f542903b 100644 --- a/src/Utils/structured-logger.ts +++ b/src/Utils/structured-logger.ts @@ -409,10 +409,8 @@ export class StructuredLogger implements ILogger { private processedLogs: number = 0 // Metrics module (lazy loaded) + // NOTE: Currently no metrics are recorded to this module - it's loaded but unused private metricsModule: typeof import('./prometheus-metrics') | null = null - private metricsQueue: Array<() => void> = [] - private metricsImportFailed = false - private readonly MAX_METRICS_QUEUE_SIZE = 1000 constructor(config: StructuredLoggerConfig) { const envConfig = loadLoggerConfig() @@ -482,18 +480,13 @@ export class StructuredLogger implements ILogger { }, this.config.bufferFlushIntervalMs) } - // Load metrics module if enabled + // Load metrics module if enabled (currently unused but loaded for future use) if (this.config.enableMetrics) { import('./prometheus-metrics').then(m => { this.metricsModule = m - this.debug('📊 Prometheus metrics loaded for logger, flushing buffered metrics', { queuedCount: this.metricsQueue.length }) - // Flush buffered metrics - this.metricsQueue.forEach(fn => fn()) - this.metricsQueue = [] + this.debug('📊 Prometheus metrics loaded for logger') }).catch(() => { - // Metrics not available - set flag and clear queue - this.metricsImportFailed = true - this.metricsQueue = [] + // Metrics module not available - silent fail }) } } @@ -900,7 +893,6 @@ export class StructuredLogger implements ILogger { this.rateLimiter = null this.circuitBreaker = null this.metricsModule = null - this.metricsQueue = [] } }