backend: Refactor recording lock acquisition logic to prevent unnecessary cleanup on active recordings
This commit is contained in:
parent
1a13d3d98b
commit
7376f1dc04
@ -64,6 +64,11 @@ export class RecordingService {
|
|||||||
let timeoutId: NodeJS.Timeout | undefined;
|
let timeoutId: NodeJS.Timeout | undefined;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// Attempt to acquire lock. If the lock is not acquired, the recording is already active.
|
||||||
|
acquiredLock = await this.acquireRoomRecordingActiveLock(roomId);
|
||||||
|
|
||||||
|
if (!acquiredLock) throw errorRecordingAlreadyStarted(roomId);
|
||||||
|
|
||||||
const room = await this.roomService.getMeetRoom(roomId);
|
const room = await this.roomService.getMeetRoom(roomId);
|
||||||
|
|
||||||
if (!room) throw errorRoomNotFound(roomId);
|
if (!room) throw errorRoomNotFound(roomId);
|
||||||
@ -78,11 +83,6 @@ export class RecordingService {
|
|||||||
|
|
||||||
if (!hasParticipants) throw errorRoomHasNoParticipants(roomId);
|
if (!hasParticipants) throw errorRoomHasNoParticipants(roomId);
|
||||||
|
|
||||||
// Attempt to acquire lock. If the lock is not acquired, the recording is already active.
|
|
||||||
acquiredLock = await this.acquireRoomRecordingActiveLock(roomId);
|
|
||||||
|
|
||||||
if (!acquiredLock) throw errorRecordingAlreadyStarted(roomId);
|
|
||||||
|
|
||||||
const startTimeoutPromise = new Promise<never>((_, reject) => {
|
const startTimeoutPromise = new Promise<never>((_, reject) => {
|
||||||
timeoutId = setTimeout(() => {
|
timeoutId = setTimeout(() => {
|
||||||
this.systemEventService.off(SystemEventType.RECORDING_ACTIVE, eventListener);
|
this.systemEventService.off(SystemEventType.RECORDING_ACTIVE, eventListener);
|
||||||
@ -123,10 +123,14 @@ export class RecordingService {
|
|||||||
throw error;
|
throw error;
|
||||||
} finally {
|
} finally {
|
||||||
try {
|
try {
|
||||||
|
if (acquiredLock) {
|
||||||
|
// Only clean up resources if the lock was successfully acquired.
|
||||||
|
// This prevents unnecessary cleanup operations when the request was rejected
|
||||||
|
// due to another recording already in progress in this room.
|
||||||
clearTimeout(timeoutId);
|
clearTimeout(timeoutId);
|
||||||
this.systemEventService.off(SystemEventType.RECORDING_ACTIVE, eventListener);
|
this.systemEventService.off(SystemEventType.RECORDING_ACTIVE, eventListener);
|
||||||
|
await this.releaseRecordingLockIfNoEgress(roomId);
|
||||||
if (acquiredLock) await this.releaseRecordingLockIfNoEgress(roomId);
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
this.logger.warn(`Failed to release recording lock: ${e}`);
|
this.logger.warn(`Failed to release recording lock: ${e}`);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user