From a699bb3343b39b63d9cb7de11d508038ab030a1a Mon Sep 17 00:00:00 2001 From: Carlos Santos <4a.santos@gmail.com> Date: Tue, 18 Mar 2025 10:58:08 +0100 Subject: [PATCH] backend: Introduce RedisLockName enum for garbage collector lock management --- backend/src/models/redis.model.ts | 7 ++++--- backend/src/services/mutex.service.ts | 6 +++--- backend/src/services/task-scheduler.service.ts | 4 ++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/backend/src/models/redis.model.ts b/backend/src/models/redis.model.ts index 1ae36de..cd27d34 100644 --- a/backend/src/models/redis.model.ts +++ b/backend/src/models/redis.model.ts @@ -1,3 +1,4 @@ -export enum RedisKeyPrefix { - LOCK = 'ov_meet_lock:', -} +export const enum RedisLockName { + GARBAGE_COLLECTOR = 'room_garbage_collector', + RECORDING_ACTIVE = 'recording_active', +} \ No newline at end of file diff --git a/backend/src/services/mutex.service.ts b/backend/src/services/mutex.service.ts index 6b141ba..7d574ae 100644 --- a/backend/src/services/mutex.service.ts +++ b/backend/src/services/mutex.service.ts @@ -1,13 +1,13 @@ import Redlock, { Lock } from 'redlock'; import { RedisService } from './redis.service.js'; import { inject, injectable } from 'inversify'; -import { RedisKeyPrefix } from '../models/redis.model.js'; @injectable() export class MutexService { protected redlockWithoutRetry: Redlock; protected locks: Map; protected readonly TTL_MS = 10_000; + protected LOCK_KEY_PREFIX = 'ov_meet_lock:' constructor(@inject(RedisService) protected redisService: RedisService) { this.redlockWithoutRetry = this.redisService.createRedlock(0); @@ -21,7 +21,7 @@ export class MutexService { * @returns A Promise that resolves to the acquired Lock object. */ async acquire(resource: string, ttl: number = this.TTL_MS): Promise { - resource = RedisKeyPrefix.LOCK + resource; + resource = this.LOCK_KEY_PREFIX + resource; try { const lock = await this.redlockWithoutRetry.acquire([resource], ttl); @@ -39,7 +39,7 @@ export class MutexService { * @returns A Promise that resolves when the lock is released. */ async release(resource: string): Promise { - resource = RedisKeyPrefix.LOCK + resource; + resource = this.LOCK_KEY_PREFIX + resource; const lock = this.locks.get(resource); if (lock) { diff --git a/backend/src/services/task-scheduler.service.ts b/backend/src/services/task-scheduler.service.ts index 121b49e..5ccdcca 100644 --- a/backend/src/services/task-scheduler.service.ts +++ b/backend/src/services/task-scheduler.service.ts @@ -3,6 +3,7 @@ import { LoggerService } from './index.js'; import { SystemEventService } from './system-event.service.js'; import { CronJob } from 'cron'; import { MutexService } from './mutex.service.js'; +import { RedisLockName } from '../models/redis.model.js'; @injectable() export class TaskSchedulerService { @@ -23,7 +24,6 @@ export class TaskSchedulerService { * @returns A promise that resolves when the garbage collector has been successfully started. */ async startRoomGarbageCollector(callbackFn: () => Promise): Promise { - const lockName = 'room-garbage-lock'; const lockTtl = 59 * 60 * 1000; // TTL of 59 minutes if (this.roomGarbageCollectorJob) { @@ -34,7 +34,7 @@ export class TaskSchedulerService { // Create a cron job to run every hour this.roomGarbageCollectorJob = new CronJob('0 * * * *', async () => { try { - const lock = await this.mutexService.acquire(lockName, lockTtl); + const lock = await this.mutexService.acquire(RedisLockName.GARBAGE_COLLECTOR, lockTtl); if (!lock) { this.logger.debug('Failed to acquire lock for room garbage collection. Skipping.');